POJ 1850 Code(組合せ数学)

6846 ワード

タイトルリンク
この問題の組み合わせの解法は,あまりにも巧みである.長さnのシナリオ数の合計はC(26,n)であり,私は発見しなかった.次に+長さが文字列と等しい場合、最初のデフォルトは、後のデフォルトは前の+1となり、インクリメント特性が保証されます.
ネット上にはDP解法もありますが、IQが下手ですね...
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 int c[27][27];

 6 int main()

 7 {

 8     int i,j,k,len;

 9     long long ans = 0;

10     char str[101];

11     for(i = 0;i <= 26;i ++)

12     c[i][0] = 1;

13     for(i = 1;i <= 26;i ++)

14     {

15         for(j = 1;j <= i;j ++)

16         c[i][j] = c[i-1][j-1] + c[i-1][j];

17     }

18     scanf("%s",str);

19     len = strlen(str);

20     for(i = 0;i < len-1;i ++)

21     {

22         if(str[i] >= str[i+1])

23         {

24             printf("0
"); 25 return 0; 26 } 27 } 28 for(i = 1;i <= len-1;++ i) 29 { 30 ans += c[26][i]; 31 } 32 for(i = 0;i < len;++ i) 33 { 34 if(i == 0) 35 j = 'a'; 36 else 37 j = str[i-1] + 1; 38 for(;j < str[i];j ++) 39 { 40 ans += c['z'-j][len-i-1]; 41 } 42 } 43 printf("%lld
",ans+1); 44 return 0; 45 }