动态规划题,由于 0 只能与其前一位结合,所以从后向前搜索。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int MAXN = 1000005;
__int64 dp[MAXN];
int num[MAXN];
string str;
int main()
{
while (cin >> str)
{
if (str[0] == '0')
break;
int n = str.size();
for (int i = 1; i <= n; i++)
{
num[i] = str[i - 1] - '0';
}
memset(dp, 0, sizeof(dp));
dp[n + 1] = 1;
for (int i = n; i >= 1; i--)
{
if (num[i] == 0)
continue;
dp[i] = dp[i + 1];
if (num[i] * 10 + num[i + 1] <= 26)
dp[i] += dp[i + 2];
}
cout << dp[1] << endl;
}
return 0;
}
继续加油。