每段可以连续的串的可能性是个Fibonacci数列 但是直接dp更好吧~~
#include <cstdio>
#include <cstring> using namespace std; char a[5010];
int main()
{
while(scanf("%s",a) && strcmp(a, "0"))
{
int len = strlen(a), cur = 1;
int b = a[0] - '0';
unsigned long long k = 1;
for(int i = 1; i < len; i++)
{
if(a[i] == '0')
{
b *= 10;
}
else if(a[i] - '0' + b*10 <= 26)
{
if(a[i+1] != '0')
cur++;
b = a[i] - '0';
}
else
{
unsigned long long d1 = 1, d2 = 2;
if(cur >= 2)
{
for(int j = 2; j < cur; j++)
{
d2 += d1;
d1 = d2 - d1;
}
k *= d2;
}
cur = 1;
b = a[i] - '0';
}
}
if(cur >= 2)
{
unsigned long long d1 = 1, d2 = 2;
for(int j = 2; j < cur; j++)
{
d2 += d1;
d1 = d2 - d1;
}
k *= d2;
}
printf("%llu\n",k);
}
return 0;
}
转一个DP的
#include <stdio.h>
#include <string.h>
#define LL long long
char s[5050];
LL d[5050];
int main()
{
while(scanf("%s",s)==1)
{
int l=strlen(s);
if(l==1&&s[0]=='0')break;
memset(d,0,sizeof(d));
d[0]=1;
for(int i=1;i<=l;i++)
{
if(s[i-1]!='0')
d[i]=d[i-1];
if(i>1&&((s[i-2]=='1'&&s[i-1]>='0')||(s[i-2]=='2'&&s[i-1]<='6'&&s[i-1]>='0')))
{
d[i]+=d[i-2];
}
}
printf("%lld\n",d[l]);
}
return 0;
}