poj 1850 code(组合数学)
题目:http://poj.org/problem?id=1850
题意:按给定的规则给字母编号。
一个很简单的题目,但是却做了好久。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int c[30][30]; 6 void init()//用杨辉三角的方法求组合数,C(n,m) 7 { 8 int i,j; 9 for(i=0; i<=26; i++) 10 c[i][0]=c[i][i]=1; 11 for(i=1; i<=26; i++) //这里记杨辉三角的第一行第一个为C(0,0) 12 for(j=1; j<i; j++) 13 c[i][j]=c[i-1][j-1]+c[i-1][j]; 14 } 15 int main() 16 { 17 int f=0,k,i,j,sum=0,x; 18 char s[20]; 19 init(); 20 cin>>s; 21 22 k=strlen(s); 23 for(i=0; i<k-1; i++) 24 if(s[i]>s[i+1]) 25 { 26 f=1; break; 27 } 28 if(f==0) 29 { 30 for(i=1; i<=k-1; i++) 31 sum+=c[26][i]; //小于位数的所有个数 32 for(i=0; i<k; i++) 33 { 34 if(i==0) x='a'; 35 else x=s[i-1]+1; 36 for(j=x; j<s[i]; j++)//核心代码,只可意会不可言传了、、、、 37 sum+=c['z'-j][k-i-1]; 38 } 39 cout<<sum+1<<endl;//加本身 40 } 41 else 42 cout<<"0"<<endl; 43 return 0; 44 }