您的位置:首页 > 其它

soj - 1001 Alphacode

2016-04-03 01:00 295 查看


样例输入:

25114

1111111111

3333333333

0

输出:

6

89

1

  乍一看这道题,好像可以用dfs解,但是结果还是体现了dfs的老问题:速度太慢,所以结果就是超时。所以后来我想到了动态规划,一下子就解决了:

#include <iostream>
using namespace std;

int size;
int arr[10000];
int dp[10000];

void DP()
{
for (int i = 1; i < size; i++) {
// 如果这一位不是0,则可以单独组一位,首先加上前一位的结果
dp[i] = 0;
if (arr[i] != 0) {
dp[i] += dp[i-1];
}
// 如果这一位可以和前一位组合,则可以加上前两位的结果(注意i=1的特殊情况)
if (arr[i-1] != 0 && (arr[i-1]*10+arr[i] <= 26)) {
if (i > 1) dp[i] += dp[i-2];
else dp[i] += 1;
}
}
}

int main()
{
string s;
while (cin >> s && s != "0") {
size = s.length();
// 首先转换成整形数组
for (int i = 0; i < size; i++) {
arr[i] = s[i] - '0';
}
// 然后进行动态规划
dp[0] = 1;
DP();
cout << dp[size-1] << endl;
}

return 0;
}


未完待续-明天再看看有没有其他方法可以解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: