#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#define LL long long
#define N 100010 //CF Div2 (220) B --- dp
using namespace std; //dp[n]数组记录的是到第n位最多有多少个9
LL k, dp[N], way[N], d[N]; //way数组,1表示从前一个传过来组合成9或者组合不了,2表示从前前个传过来,3表示两种都行
int main()
{
int t, j;
char a[N];
while(scanf("%s", a)!=EOF)
{
j=strlen(a);
dp[0]=0;
for(t=1; t<j; ++t)
{
if(t==1)
dp[t]=(a[t]+a[t-1]=='0'+'9');
else if(a[t]+a[t-1]=='0'+'9')
dp[t]=dp[t-2]+1;
else dp[t]=dp[t-1];
}
for(t=2; t<j; ++t)
{
way[t]=1; //默认每个都是从前面传过来的
k=dp[t-1];
if(a[t]+a[t-1]=='0'+'9')
{
if(k==dp[t])
{
way[t]|=1; //直接dp[t-1]前面就行了,不需要和a[t]搭配
}
if(dp[t-2]+1==k) //a[t-1]和a[t]搭配
{
way[t]|=2;
}
if(dp[t-2]+1>k) //a[t-1]只能和a[t]搭配
{
way[t]=2;
}
}
}
d[0]=d[1]=1;
for(t=2; t<j; ++t)
{
d[t]=0;
if(way[t]&1) //两条途径
{
d[t]+=d[t-1];
}
if(way[t]&2)
{
d[t]+=d[t-2];
}
}
printf("%I64d\n", d[j-1]);
}
return 0;
}
CF Div2 (220) B --- dp
最新推荐文章于 2021-02-07 00:43:02 发布