需要注意的是0这个问题 0是不可能单独代表一个字母的 只能与前面的数组组成字母  a[i]是1-9时 dp[i]=dp[i-1],当a[i]与a[i-1]能组成10-26时 dp[i]=dp[i-1]+dp[i-2]。

#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
long long dp[5010];
char s[5010];
int a[5015];
int is_ok(int x)
{
    if(x>=10 && x<27)
        return 1;
    return 0;
}
int main()
{
    while(scanf("%s",s)!=EOF && strcmp(s,"0"))
    {
        memset(dp, 0, sizeof(dp));
        int len=strlen(s);
        for(int i=0; i<len; i++)
            a[i+1]=s[i]-'0';
        dp[2]=dp[1]=1;
        if(a[2] && is_ok(a[1]*10+a[2])) dp[2]=2;
        for(int i=3; i<=len; i++)
        {
            if(a[i])
            dp[i]=dp[i-1];
            if(is_ok(a[i-1]*10+a[i]))
            dp[i]+=dp[i-2];
        }
        printf("%I64d\n",dp[len]);
    }
    return 0;
}
View Code

 

posted on 2013-08-09 18:36  风流monkey  阅读(165)  评论(0)    收藏  举报