zoukankan      html  css  js  c++  java
  • codeforces Minesweeper 1D

    题意:就是挖地雷,给你一个字符串,‘*’代表地雷,‘1’代表在它的周围有1个地雷,‘2’代表在左右都有个地雷,‘?’代表不确定是不是地雷,可以是1,2,*,问你最后有几种方式确定所有的的地雷。

    思路:dp[i][0] 代表次位置为0,dp[i][1]代表左边有地雷,dp[i][2]代表右边有地雷,dp[i][3]代表左右都有,dp[i][4]代表此位置为地雷。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define maxn 1000100
     5 #define ll long long
     6 using namespace std;
     7 const int mod=1000000007;
     8 
     9 char str[maxn];
    10 ll dp[maxn][5];
    11 
    12 int main()
    13 {
    14    while(scanf("%s",str)!=EOF)
    15    {
    16         int k=strlen(str);
    17         memset(dp,0,sizeof(dp));
    18         if(str[0]=='0') dp[0][0]=1;
    19         else if(str[0]=='1') dp[0][2]=1;
    20         else if(str[0]=='*') dp[0][4]=1;
    21         else if(str[0]=='?')
    22         {
    23             dp[0][0]=dp[0][2]=dp[0][4]=1;
    24         }
    25         for(int i=1; i<k; i++)
    26         {
    27             if(str[i]=='0')
    28             {
    29                dp[i][0]+=(dp[i-1][1]+dp[i-1][0]);
    30                dp[i][0]%=mod;
    31             }
    32             else if(str[i]=='1')
    33             {
    34                 dp[i][1]+=dp[i-1][4];
    35                 dp[i][2]+=dp[i-1][0]+dp[i-1][1];
    36                 dp[i][1]%=mod;
    37                 dp[i][2]%=mod;
    38             }
    39             else if(str[i]=='2')
    40             {
    41                 dp[i][3]+=dp[i-1][4];
    42                 dp[i][3]%=mod;
    43             }
    44             else if(str[i]=='*')
    45             {
    46                 dp[i][4]+=dp[i-1][2]+dp[i-1][3]+dp[i-1][4];
    47                 dp[i][4]%=mod;
    48             }
    49             else if(str[i]=='?')
    50             {
    51                 dp[i][0]+=dp[i-1][0]+dp[i-1][1];
    52                 dp[i][0]%=mod;
    53                 dp[i][1]+=dp[i-1][4];
    54                 dp[i][1]%=mod;
    55                 dp[i][2]+=dp[i-1][1]+dp[i-1][0];
    56                 dp[i][2]%=mod;
    57                 dp[i][3]+=dp[i-1][4];
    58                 dp[i][3]%=mod;
    59                 dp[i][4]+=dp[i-1][2]+dp[i-1][3]+dp[i-1][4];
    60                 dp[i][4]%=mod;
    61             }
    62         }
    63         ll ans=dp[k-1][0]+dp[k-1][1]+dp[k-1][4];
    64         ans%=mod;
    65         printf("%lld
    ",ans);
    66    }
    67    return 0;
    68 }
    View Code
  • 相关阅读:
    bzoj3380+3381+3382+3383 Usaco2004 Open
    浅谈树链剖分(C++、算法、树结构)
    小学奥数 最大公约数与最小公倍数
    小学奥数 质数的和与积
    小学奥数 分苹果
    小学奥数 连乘积末尾0的个数
    小学奥数 李白的酒
    小学奥数 回文数个数
    小学奥数 等差数列末项计算
    小学奥数 地球人口承载力估计
  • 原文地址:https://www.cnblogs.com/fanminghui/p/4273125.html
Copyright © 2011-2022 走看看