题目:http://poj.org/problem?id=1850
略模拟,思路见代码。关键是思路清晰,转化为代码的能力。
#include<iostream> #include<cstdio> using namespace std; char c; int a[15],len; long long s[15][30],sum; void yun() { for(int i=1;i<=26;i++) s[1][i]=1; for(int i=2;i<=len;i++) for(int j=26-i+1;j;j--) s[i][j]=s[i][j+1]+s[i-1][j+1]; } void pls1() { for(int i=1;i<=len;i++)//a的位数 for(int j=a[i-1]+1;j<a[i];j++)//+的首字母 sum+=s[len-i+1][j]; } void pls2(int cur) { for(int i=1;i<=26-cur+1;i++) sum+=s[cur][i]; } int main() { while(scanf("%c",&c)==1) { if(c==' ')break; a[++len]=(int)c-96; if(a[len]<=a[len-1]) { printf("0"); return 0; } } yun(); for(int i=1;i<len;i++) pls2(i); pls1(); printf("%lld",sum+1); return 0; }