Sicily1001 Alphacode

来源:互联网 发布:众筹平台数据统计 编辑:程序博客网 时间:2024/05/29 02:13

题目地址:http://soj.me/1001

思路解析:是动态规划的一个很好的练手练习题。主要思路就是考虑前i个字符串和前i-1个字符串的解码数量之间的关系。

1、如果Si-1Si在[1, 26]之间,则dpArr[i] = dpArr[i-1] + dpArr[i],其中dp[i]代表前i个字符组成数字的最大解码数量。

2、否则,dpArr[i] = dpArr[i-1];

3、最麻烦的是考虑0的情况!为此我付出n多次的WA。。。

分享几个测试用例,奇数行为输入,偶数行为输出:

102031011020111

代码如下所示

#include <iostream>#include <string>#include <cstring>using namespace std;int dpArr[10000];int main(void){string str;while(cin >> str && str[0] != '0'){memset(dpArr, 0, sizeof(dpArr));dpArr[0] = 1;dpArr[1] = 1;for(int i=2; i <= str.length(); i++){if((str[i-1-1] - '0') * 10 + str[i-1] - '0' <= 26){if(str[i-1] == '0'){dpArr[i] = dpArr[i-2]; }else{if(str[i-1-1] == '0'){dpArr[i] = dpArr[i-1];}else{dpArr[i] = dpArr[i-1] + dpArr[i-2];}}}else{if(str[i-1] == '0'){dpArr[str.length()] = 0;break;}else{dpArr[i] = dpArr[i-1];}}}cout << dpArr[str.length()] << endl;}return 0;}


原创粉丝点击