您的位置:首页 > 其它

poj 1850 Code

2013-07-09 09:34 323 查看
#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;//加上当前串。
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: