NOIP模拟 mine DP

Posted Loser Of Life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP模拟 mine DP相关的知识,希望对你有一定的参考价值。

题面不给……题意:找出合法字符串填法。

明显是个思博线性递推这都推不出来简直智硬$O(n)$搞啊……

但是细节成功绝杀……考虑字符为$1$时,需要分开考虑地雷在前在后的情况……

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn=(int)1e6+5,mod=(int)1e9+7;
 7 char s[maxn];int f[maxn][5];//0 0 1 2 2 * 3 1* 4 *1
 8 int haha()
 9 {
10     scanf("%s",s+1);int n=strlen(s+1);
11     if(s[1]==?)f[1][0]=f[1][2]=f[1][3]=1;
12     else if(s[1]==0)f[1][0]=1;
13     else if(s[1]==1)f[1][3]=1;
14     else f[1][2]=1;
15     for(int i=2;i<=n;i++)
16     {
17         if(s[i]==*)f[i][2]=((f[i-1][3]+f[i-1][2])%mod+f[i-1][1])%mod;
18         else if(s[i]==0)f[i][0]=(f[i-1][4]+f[i-1][0])%mod;
19         else if(s[i]==2)f[i][1]=f[i-1][2];
20         else if(s[i]==1)f[i][3]=(f[i-1][4]+f[i-1][0])%mod,
21                             f[i][4]=f[i-1][2];
22         else
23         {
24             f[i][0]=(f[i-1][4]+f[i-1][0])%mod;
25             f[i][1]=f[i-1][2];
26             f[i][2]=((f[i-1][3]+f[i-1][2])%mod+f[i-1][1])%mod;
27             f[i][3]=(f[i-1][4]+f[i-1][0])%mod;
28             f[i][4]=f[i-1][2];
29         }
30     }
31     printf("%d\n",((f[n][0]+f[n][2])%mod+f[n][4])%mod);
32 }
33 int sb=haha();
34 int main(){;}
A

 

以上是关于NOIP模拟 mine DP的主要内容,如果未能解决你的问题,请参考以下文章

火山喷发 计蒜客16862 NOIP模拟赛 概率DP

Jzoj 3056NOIP2012模拟10.27容斥DP数学数字

不死的LYM NOIP模拟 二分+状压DP

配置魔药 [NOIP模拟] [DP] [费用流]

HZOI20190816模拟23 mine/water/gcd

NOIP模拟赛超级树 DP