很明显的动态规划...dp[i]的状态等于dp[i-1] 或者 等于 dp[i-1]+dp[i-2] 或者等于 dp[i-2] ...
关键的就是注意号细节...
1 . dp [ i - 1 ] 能转移过来的条件是 s [ i ] 非0...
2. dp [ i - 2 ] 能转移过来的条件是 s[ i -1 ] *10 + s[ i ] 在[ 10 , 26 ] ...
3. 若有两个连着的0..是不存在任何结果的..输出0
#include<iostream>
#include<queue>
#include<stdio.h>
#include<math.h>
#define oo 200000000
using namespace std;
char s[10001];
long long i,l,dp[10001],k;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
while (gets(s+1))
{
if (s[1]=='0') break;
l=strlen(s+1);
memset(dp,0,sizeof(dp));
dp[0]=dp[1]=1;
for (i=2;i<=l;i++)
{
if (s[i]-'0') dp[i]=dp[i-1];
k=s[i]-'0'+(s[i-1]-'0')*10;
if (k<27 && k>9) dp[i]+=dp[i-2];
if (!k) { dp[l]=0; break; }
}
printf("%I64d\n",dp[l]);
}
return 0;
}