zoukankan      html  css  js  c++  java
  • YYHS-NOIP模拟赛-mine

    题解

    这道题不难想到用dp来做

    dp[i][0]表示第i个格子放0

    dp[i][1]表示第i个格子放1且第i-1个格子放雷

    dp[i][2]表示第i个格子放2

    dp[i][3]表示第i个格子放1且第i+1个格子放雷

    dp[i][4]表示第i个格子放雷

    然后就是转移了

    不难发现

    上一层的0,1能推到这一层的0

    上一层的4推到1

    上一层的4推到2

    0,1推到3

    2,3,4推到4

    如果当前格子是?,那么上面的情况就需要都考虑

    最后是初始化

    我们可以发现第0层只能放0和3,其他是不能放的

     1 #include<bits/stdc++.h>
     2 #define L 1000005
     3 #define ll long long
     4 #define mod 1000000007
     5 using namespace std;
     6 int len;
     7 ll dp[L][5];
     8 char s[L];
     9 int main(){
    10     scanf("%s",s+1);
    11     len=strlen(s+1);
    12     dp[0][0]=dp[0][3]=1;
    13     for (int i=1;i<=len;i++){
    14         if (s[i]=='0'||s[i]=='?') dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod;
    15         if (s[i]=='1'||s[i]=='?') dp[i][1]=dp[i-1][4],dp[i][3]=(dp[i-1][0]+dp[i-1][1])%mod;
    16         if (s[i]=='2'||s[i]=='?') dp[i][2]=dp[i-1][4];
    17         if (s[i]=='*'||s[i]=='?') dp[i][4]=(dp[i-1][2]+dp[i-1][3]+dp[i-1][4])%mod;
    18         if (s[i]=='0') dp[i][1]=dp[i][2]=dp[i][3]=dp[i][4]=0;
    19         if (s[i]=='1') dp[i][0]=dp[i][2]=dp[i][4]=0;
    20         if (s[i]=='2') dp[i][0]=dp[i][1]=dp[i][3]=dp[i][4]=0;
    21         if (s[i]=='*') dp[i][0]=dp[i][1]=dp[i][2]=dp[i][3]=0;
    22     }
    23     printf("%lld
    ",(dp[len][0]+dp[len][1]+dp[len][4])%mod);
    24     return 0;
    25 }
    View Code
  • 相关阅读:
    Linux 常用命令-01
    神经网络工具箱torch.nn -05
    Autograd与计算图-04
    Tensor的索引与变形-03
    Tensor数据类型-00
    Tensor的创建与维度查看-01
    转载:网友对rootfs的理解
    【转载】linux启动流程分析
    windows7 自带计算器bug
    网上同仁对linux文件系统的剖析
  • 原文地址:https://www.cnblogs.com/zhuchenrui/p/7681995.html
Copyright © 2011-2022 走看看