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