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 }

 

posted @ 2013-10-18 20:20  水门  阅读(161)  评论(0编辑  收藏  举报