poj 2033 dp 正确的解码方法数

来源:互联网 发布:苹果系统清理软件 编辑:程序博客网 时间:2024/06/04 19:24

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


0 0
原创粉丝点击