一共三种状态:
1。当前数是0的话,只能和之前的数组合,dp[i]=dp[i-2]; 例如11110: 111 10
2。当前不为0,之前的数不为0并且组合产生的字母不超出范围(11-26),说明这个数既可以和之前组合,也可以不组合,dp[i]=dp[i-2]+dp[i-1] 例如1111有两种分割:
11 11 ,111 1。
3。当前数不为0,但之前的数为0,之前的数不能和当前数组合,dp[i]=dp[i-1]; 例如:11101:1110 1
dp[0],dp[1]是边界。
#include"stdio.h"
#include"iostream"
#include"algorithm"
#include"string"
using namespace std;
typedef long long ll;
const int maxn=50001;
ll dp[maxn];
int main()
{
string a;
while(cin>>a)
{
if(a[0]=='0')break;
dp[0]=1;int len=a.size();
for(int i=1;i<len;i++)
{
int num1=a[i]-48;int num2=a[i-1]-48;int num=num1+num2*10;
if(num1==0)
{
if(i==1) dp[i]=1;
else dp[i]=dp[i-2];
}
else
{
if(num>=11&&num<=26)
{
if(i==1) dp[i]=2;
else dp[i]=dp[i-1]+dp[i-2];
}
else
dp[i]=dp[i-1];
}
}
cout<<dp[len-1]<<endl;
}
}