经典dp问题
![](https://i-blog.csdnimg.cn/blog_migrate/6ad6dd2decd6a4796ad4230b5b8093c0.png)
int numDecodings(char * s){
int dp[101]={0};
if(s[0]=='0')return 0;
dp[0]=1;//默认第一个字符为非零数字
for(int i=1;i<strlen(s);i++){//遍历过程中只考虑当前dp[i]不考虑之后的情况
dp[i]=0;//若当前编码为0则至少dp[i]=0
if(s[i]!='0')dp[i]=dp[i-1];//若当前编码不为0,则当前方案数至少等于dp[i-1]多一个编码不增加方案
//该行以上不考虑组合编码 即将当前字符作为单独一个编码出现的方案数
if(s[i-1]=='1'||s[i-1]=='2'&&s[i]<='6'){//当前字符可以与上一个字符组成编码
if(i==1)dp[i]+=dp[0];//在至少的基础上加一种方案
else dp[i]+=dp[i-2];//dp[i-2]当前字符形成组合字符即多一个编码不增加方案
}
}
return dp[strlen(s)-1];
}