题解看注释...看了好几个dp有好多都是有思路写不出来代码..代码能力太次了(例如1111,模拟题.花了一天也没给写完). 然后就是看大黄dp分类发现好多都是背包或者LCS变形(现在看到两行数,都觉得是lcs)..明天得研究一下背包.. /* * zoj 2022 来自大黄dp分类.. 一维dp..有点水,有点郁闷的地方就是0的处理... * 递推公式: * dp[i][j] = dp[i][j-2]; 当num[i] == 0; * dp[i][j] = dp[i][j-1]+dp[i][j-2]; num[i] 和num[i-1]满足大于0小于27; * dp[i][j] = dp[i][j-1]; 当num[i]和num[i-1]满足不了大于0小于27的情况时; * zjy 2011 03 09 * */ #include <stdio.h> #include <string.h> #define MAX 50000 int judge(char a,char b) { if(a=='0') return 0; if(a>'2') return 0; if(a=='2'&&b>'6') return 0; return 1; } int main(void) { char num[MAX]; int dp[MAX]; while (scanf("%s",num) != EOF && num[0]!='0') { int len = strlen(num); memset(dp,0,sizeof(dp)); dp[0]=1; for (int i=1;i<len;i++) { if(num[i]=='0') { if(i>=2) dp[i] = dp[i-2]; else dp[i] = 1; } else if(judge(num[i-1],num[i])) //能够组成26以内的数; { if(i>=2) dp[i]=dp[i-1]+dp[i-2]; else dp[i] = dp[i-1]+1; } else dp[i] = dp[i-1]; } printf("%d/n",dp[len-1]); } return 0; }