poj 1850 Code
来源:互联网 发布:ubuntu 16.04安装分区 编辑:程序博客网 时间:2024/06/04 19:25
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dp[33][33];//表示的是长度为i + 1, 第一个字母为j + ‘a' 的串总共有多少个。int sum[33];void getdp(){ int i, j, k; memset(dp, 0, sizeof(dp)); memset(sum, 0, sizeof(sum));//记录长度为i + 1 的所有串的个数。 for(i = 0; i < 26; i ++) { dp[0][i] = 1; sum[0] += dp[0][i]; } for(i = 1; i < 26; i ++) { for(j = 0; j < 26; j ++) { for(k = j + 1; k < 26; k ++) { dp[i][j] += dp[i - 1][k];//递推公式。每一项都可以由第二个字母位置满足条件的字母情况的和求得。 } sum[i] += dp[i][j]; } }}int main(){ char ch[13]; int l, i, j, ans, flag; getdp();//初始化。 while(cin >> ch) { l = strlen(ch); flag = ans = 0; for(i = 1; i < l; i ++) { if(ch[i] <= ch[i - 1]) { flag = 1; break; } } if(flag) { cout << 0 << endl; continue; } for(i = 0; i < l; i ++) { if(i) j = ch[i - 1] - 'a' + 1; else j = i; for(; j < ch[i] - 'a'; j ++) { ans += dp[l - i - 1][j]; } if(i < l - 1)ans += sum[l - i - 2]; } cout << ans + 1 << endl;//加上当前串。 }}