ZOJ 2202
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 50000;
long dp[N];
char code[N];
//若是12,23这种可分解为1,2;3,4的形式的数则返回true;
//若是02,34这种只能分解一种形式的,则返回false。
bool isDevidable(char a,char b)
{
if(a == '0' || b=='0' || a>'2' || (a=='2'&&b>'6') )
return false;
return true;
}
int main()
{
int i=0,len;
while(scanf("%s",code) != EOF && code[0] != '0')
{
len = strlen(code);
dp[0] = 1;
if(code[1] == '0' || !isDevidable(code[0],code[1]) )
dp[1] = 1;
else
dp[1] = 2;
for(i=2; i<len; i++)
{
if(code[i] == '0')
{
dp[i] = dp[i-2];
}
else
{
bool flag = isDevidable(code[i-1],code[i]);
if(flag)
dp[i] = dp[i-1] + dp[i-2];
else
dp[i] = dp[i-1];
}
}
printf("%d\n",dp[len-1]);
}
return 0;
}
多学习,多总结。

浙公网安备 33010602011771号