codeforce404 D. Minesweeper 1D DP递推

给定一个一维矩阵,其中包含‘1’、‘2’、‘0’、‘*’、‘?’,扫雷小游戏——1表示左右有一个雷,2表示左右都有雷,0表示左右都没有雷,*表示雷,?表示未知,求其中有多少种可能的情况,若该图自相矛盾也输出0

dp[L][2][2]表示档期位置为L,当前位置若是雷则为1,否则为0,下一位置若是雷则为1,否为0

递推时需要判断:根据不同情况分类讨论

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e6+5;
const long long MOD=1e9+7;
char s[MAX];
int L;
long long dp[MAX][2][2];
int main()
{
    while(~scanf("%s",s+1))
    {
        memset(dp,0,sizeof(dp));
        L=strlen(s+1);dp[0][0][0]=dp[0][0][1]=1;
        for(int i=1;i<=L;++i)
        {
            if(s[i]=='0')
            {
                dp[i][0][0]=dp[i-1][0][0];
            }
            else if(s[i]=='1')
            {
                dp[i][0][1]=dp[i-1][0][0];
                dp[i][0][0]=dp[i-1][1][0];
            }
            else if(s[i]=='2')
            {
                dp[i][0][1]=dp[i-1][1][0];
            }
            else if(s[i]=='*')
            {
                dp[i][1][0]=(dp[i-1][1][1]+dp[i-1][0][1])%MOD;
                dp[i][1][1]=dp[i][1][0];
            }
            else
            {
                dp[i][0][0]=(dp[i-1][1][0]+dp[i-1][0][0])%MOD;
                dp[i][0][1]=dp[i][0][0];
                dp[i][1][0]=(dp[i-1][0][1]+dp[i-1][1][1])%MOD;
                dp[i][1][1]=dp[i][1][0];
            }
        }
        long long ans=0;
        if(s[L]=='0') ans=dp[L-1][0][0];
        else if(s[L]=='1') ans=dp[L-1][1][0];
        else if(s[L]=='2') ans=0;
        else if(s[L]=='*') ans=(dp[L-1][0][1]+dp[L-1][1][1])%MOD;
        else ans=(dp[L-1][0][0]+dp[L-1][1][0]+dp[L-1][0][1]+dp[L-1][1][1])%MOD;
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Nrtostp/article/details/83241227
今日推荐