简单的动态规划。基点是将最后一位 store[len-1] 初始化为1,store[len] = 1 是为 ss[len - 2] 服务的。注意考虑一下特殊情况:字符串中间出现0的时候,只能与前一位搭配。代码如下:
#include <iostream>
#include <string>
using namespace std;
void dfs(int pos,int len,string& ss,int* store)
{
if (pos == len - 1) return;
if (ss[pos] == '0') return;
if (!store[pos + 1]) dfs(pos + 1,len,ss,store);
store[pos] += store[pos + 1];
if (ss[pos] > '2') return;
if (ss[pos] == '2' && ss[pos + 1] > '6') return;
if (!store[pos + 2]) dfs(pos + 2,len,ss,store);
store[pos] += store[pos + 2];
}
int main()
{
string ss;
while(cin >> ss)
{
if (ss[0] == '0') break;
if (ss.length() == 1)
{
cout << 1 << endl;
continue;
}
int len = ss.length();
int* store = new int[len + 1];
for (int i = 0;i < len + 1;i ++)
store[i] = 0;
store[len] = 1;
if (ss[len - 1] != '0') store[len - 1] = 1;
dfs(0,len,ss,store);
cout << store[0] << endl;
delete []store;
}
}