poj 2033 dp 正确的解码方法数

题意:给定一种英文的编码方式,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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值