需要注意的是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; }
浙公网安备 33010602011771号