直接按题意模拟dp即可..
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5,M=2;
const int mod=1e9+7;
char s[N];
ll f[N][M][M];//到了第i个位子,i这个位子有无火,i+1这个位子有无火.
int main()
{
scanf("%s",s+1);
int n=strlen(s+1);
f[0][0][1]=f[0][0][0]=1;
for(int i=1;i<=n;i++)
{
if(s[i]=='0')
{
f[i][0][0]+=f[i-1][0][0];
f[i][0][0]%=mod;
}
else if(s[i]=='1')
{
f[i][0][1]+=f[i-1][0][0];
f[i][0][1]%=mod;
f[i][0][0]+=f[i-1][1][0];
f[i][0][0]%=mod;
}
else if(s[i]=='2')
{
f[i][0][1]+=f[i-1][1][0];
f[i][0][1]%=mod;
}
else if(s[i]=='*')
{
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
f[i][1][j]+=f[i-1][k][1],f[i][1][j]%=mod;
}
else
{
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
for(int l=0;l<2;l++)
f[i][j][k]+=f[i-1][l][j],f[i][j][k]%=mod;
}
}ll ans=f[n][1][0]+f[n][0][0];
printf("%lld\n",ans);
return 0;
}
京公网安备 11010502036488号