样例输入:
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;
}
未完待续-明天再看看有没有其他方法可以解。