题意:给定一种英文的编码方式,a编码为1,b编码为2...z编码为26。那么一串数字可以有不同的解码方式(比如26,可以译为z,也可以译为bf)。给定一个合理的数字串,问解码的可能个数。
思路:dp[i]表示s[1]...s[i]这些串能够组成的串的个数。那么如果s[i]=0,那么它必然不可能单独组成字符;如果不为0,那么它可以单独组成字符,即:dp[i]+=dp[i-1]。
再考虑连字符情况,只要s[i-1]s[i]组成的是合理的即可,此时dp[i]+=dp[i-2]。初始化dp[0] = dp[1] = 1;
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstdlib>
using namespace std;
#define clc(s,t) memset(s,t,sizeof(s))
#define INF 0x3fffffff
#define N 100005
char s[N];
long long dp[N];
int main(){
while(scanf("%s",s+1) && strcmp(s+1, "0")){
int i,j;
clc(dp,0);
dp[0] = 1;
dp[1] = 1;
for(i = 2;s[i];i++){
if(s[i] != '0')
dp[i] += dp[i-1];
if(s[i-1]=='1' ||(s[i-1]=='2'&&s[i]<='6'))
dp[i] += dp[i-2];
}
printf("%lld\n",dp[i-1]);
}
return 0;
}