直接按题意模拟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; }