poj 2033 Alphacode

本文介绍了一个简单的动态规划(DP)问题——字符串译码。问题要求计算给定数字串转换为字母的不同方式数量。文章通过示例代码详细解释了如何处理数字0和边界情况,并分享了一些调试技巧。

简单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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值