一看就知道是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; }