简单DP,里面是有0的,把0区分清楚就可以A掉了,还有个需要注意的,这个数组开1000会运行错误,最好大点开。
题意:1……26表示A到Z,因为11可以有AA和K2种意思,所以要你求给你的这个译码的原文可能有多少种。
思路:还是跟上面说的一样,主要是区分这个0的存在和26这个介值。
看代码吧,我相信还算是清晰。
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 50001
#define max(a1,b1) (a1)>(b1)?(a1):(b1)
using namespace std;
char str[N];
long long dp[N],len;
int main(void)
{
while(scanf("%s",str+1)!=EOF)
{
len = strlen(str+1);
if(len==1&&str[1]=='0')
break;
dp[0] = 1;
dp[1] = 1;
for(int i=2;i<=len;++i)
{
int x = str[i-1]-'0';
int y = str[i] - '0';
x *= 10; x += y;
if(y==0)
{
dp[i] = dp[i-2];
}
else if(x<=10)
{
dp[i] = dp[i-1];
}
else if(x<=26)
{
dp[i] = dp[i-2]+dp[i-1];
}
else
{
dp[i] = dp[i-1];
}
}
cout<<dp[len]<<endl;
}
return 0;
}
本文介绍了一个简单的动态规划(DP)问题——字符串译码。问题要求计算给定数字串转换为字母的不同方式数量。文章通过示例代码详细解释了如何处理数字0和边界情况,并分享了一些调试技巧。
472

被折叠的 条评论
为什么被折叠?



