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;//加上当前串。    }}