Sicily.1001. Alphacode

//1001. Alphacode
//
// 
//题目大意:
//将一串字符串(只有A-Z)转化成数字0-9,转换的规则:A->1,B->2 ......Z->26。
//那么从这段数字再转换回去字符串就会发生一些歧义,题目要求求出一段数字转换成字符串的最多数量。
// 
//解题思路:
//如果说用dp[i]表示当前的前i个数字能够转化的字符串数量,当str[i+1]加进来时,如果说跟前面的一个字符能够构成26以下的数字,那说明这个状态至少有两种组合选择:
//跟第i个数字一起翻译,那么前i-1个就是一个子状态了;
//单独翻译,那前i个作为一个整体;
//于是状态的转移就是:dp[i] = dp[i-1] + dp[i-2]
//当然,这里需要考虑0的状况,因为0是不能作为十位数并且不能单独翻译的,所以有了另外的两个状态转移。
#include <iostream>
#include <stdlib.h>
#include <string>
#include <memory.h>
using namespace std;
#define MAX 10000



int main()
{

  int dp[MAX];
  string a;
  while(cin >> a && a !="0")
  {
     memset(dp,0, sizeof(dp));
     dp[0] = 1;
     dp[1] = 1;
     for(int i=2; i<=a.length(); i++){
        int a1 = a[i-1] - '0';
        int a2 = a[i-2] - '0';
        if(a1 != 0 && a2 != 0 && (a2*10 + a1) <= 26){
              dp[i] = dp[i-1] + dp[i-2];      
        }
        else {
             if(a1 == 0)
               dp[i] = dp[i-2];
             else
               dp[i] = dp[i-1];     
        }                
     }
     cout << dp[a.length()] << endl;
  }
  system("pause");
  return 0;   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值