一看就知道是dp 但就不知道怎么写啊啊啊啊
看到设方程为dp[N][2][2] 时瞬间就知道了
有了这个方程在按着条件写就行了
具体情况看注释
#include <bits/stdc++.h>
#define ll long long
ll const N=1e6+5;
ll const mod=1e9+7;
using namespace std;
ll dp[N][2][2];
string a;
/*
0:这个格子没有烈焰,且其左右两个格子均没有烈焰
1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰
2:这个格子没有烈焰,且其左右两个格子中均有烈焰
*:这个格子有烈焰
?:未告诉你本格情况*/
int main()
{
cin>>a;
int len=a.length();
a=' '+a;
dp[0][0][0]=1;dp[0][0][1]=1;
for(int i=1;i<=len;++i) ///1 有 0 无 i i-1 i+1 代表位置
{
if(a[i]=='0'){
dp[i][0][0]+=dp[i-1][0][0];/// i-1 i i+1 0
dp[i][0][0]%=mod;
}
else if(a[i]=='1'){
dp[i][0][1]+=dp[i-1][0][0];/// i-1 i 0 / i+1 1
dp[i][0][1]%=mod;
dp[i][0][0]+=dp[i-1][1][0];/// i i+1 0 / i-1 1
dp[i][0][0]%=mod;
}
else if(a[i]=='2'){
dp[i][0][1]+=dp[i-1][1][0];/// i 0 / i-1 i+1 1
dp[i][0][1]%=mod;
}
else if(a[i]=='*'){
dp[i][1][1]+=(dp[i-1][0][1]+dp[i-1][1][1]);/// i+1 i 1 / i-1(0/1)
dp[i][1][1]%=mod;
dp[i][1][0]+=(dp[i-1][0][1]+dp[i-1][1][1]);/// i 1 / i+1 0 / i-1(0/1)
dp[i][1][0]%=mod;
}
else if(a[i]=='?'){
dp[i][1][0]+=(dp[i-1][1][1]+dp[i-1][0][1]);/// i 1 / i+1 0 / i-1(0/1)
dp[i][1][0]%=mod;
dp[i][1][1]+=(dp[i-1][1][1]+dp[i-1][0][1]);/// i+1 i 1 / i-1(0/1)
dp[i][1][1]%=mod;
dp[i][0][0]+=(dp[i-1][1][0]+dp[i-1][0][0]);/// i+1 i 0 / i-1(0/1)
dp[i][0][0]%=mod;
dp[i][0][1]+=(dp[i-1][0][0]+dp[i-1][1][0]);/// i 0 / i+1 1 / i-1(0/1)
dp[i][0][1]%=mod;
}
}
int ans=0;
ans+=(dp[len][1][0]+dp[len][0][0])%mod;
cout<<ans<<endl;
return 0;
}

京公网安备 11010502036488号