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; }
多学习,多总结。