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