POJ 1850 Code

  早晨有点迷糊,读错题WA了一次,然后又CE了一次.....

  给出一个字符串  均为小写字母 且 长度   <= 10

  若给出的字符串可编码则输出对应数字,否则输出0.

  可编码的要求为:字母的字典许从左到右一次增大。

  设len为字符串长度,i 为对应字母,f[][] 为 长度为len 首字母为 i 是 的情况 ,则有:

  当 len = 1 时  f[1][i] = 1;

  当 len = 2 时  f[2][i] = 26-i;

  当 len >= 3 时   f[len][i] = f[len-1][i+1] +……+f[len-1][26-len+1];

  统计时先统计比给出字符串长度短的情况,然后统计与其长度相等的情况。

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 
 7 #define LL unsigned long long
 8 
 9 using namespace std;
10 
11 char num[12];
12 LL ans[12][28];
13 
14 void init()
15 {
16     LL i,j,k,sum;
17 
18     for(i = 1; i <= 26; ++i)
19         ans[1][i] = 1;
20     for(i = 1; i <= 25; ++i)
21         ans[2][i] = 26 - i;
22 
23     for(i = 3; i <= 10; ++i)
24     {
25         for(j = 1; j <= 27-i; ++j)
26         {
27             for(sum = 0,k = j+1; k <= 28-i; ++k)
28             {
29                 sum += ans[i-1][k];
30             }
31             ans[i][j] = sum;
32         }
33     }
34 }
35 
36 int main()
37 {
38     init();
39     cin>>num;
40 
41     LL sum,tsum,len,i,j;
42 
43     for(i = 1,len = strlen(num); i < len; ++i)
44     {
45         if(num[i] <= num[i-1])
46         {
47             cout<<"0"<<endl;
48             return 0;
49         }
50     }
51 
52 
53 
54     sum = 0;
55 
56     for(i = 1,len = strlen(num); i < len; ++i) //统计小于len的情况
57     {
58         for(j = 27-i; j >= 1; --j)
59             sum += ans[i][j];
60     }
61 
62     for(i = 0; i < len; ++i)
63     {
64         tsum = 0;
65         for(j = (i == 0 ? 1 : num[i-1] - 'a' + 2); j < num[i]-'a' + 1; ++j)
66         {
67             tsum += ans[len-i][j];
68         }
69 
70         sum += tsum;
71     }
72     ++sum;
73     cout<<sum<<endl;
74 
75     return 0;
76 }
View Code
原文地址:https://www.cnblogs.com/zmx354/p/3308070.html