题目描述

有一个$1$维的扫雷游戏,每个格子用$*$表示有雷,用$0/1/2$表示无雷并且相邻格子中有$0/1/2$个雷。
给定一个仅包含$?$、$*$、$0$、$1$、$2$的字符串$s$,问有多少种方法将所有的$?$改为$*/0/1/2$使其合法。


输入格式

一行一个字符$s$。


输出格式

一行一个整数表示答案,对${10}^9+7$取模。


样例

样例输入:

?1?

样例输出:

2


数据范围与提示

对于$30\%$的数据,$|S|\leqslant 20$。
对于$60\%$的数据,$|S|\leqslant 1,000$。
对于$100\%$的数据,$|S|\leqslant {10}^6$。


题解

显然数据范围只允许我们$\Theta(n)$求解,那么也只能考虑$DP$了。

设$dp[i][j]$表示到了$i$位置,当前选了$j$,$j$分为五种情况,如下:

  $\alpha.$当前位置没有雷。

  $\beta.$当前位置左边有一个雷。

  $\gamma.$当前位置旁边有两个雷。

  $\delta.$当前位置有雷。

  $\epsilon.$当前位置左边有雷。

为方便,以上五种情况下面均以数字$0\sim 5$代替。

那么现在来考虑转移,首先是第一个位置,分为四种情况:

  $\alpha.$无雷:$dp[1][0]=1$。

  $\beta.$旁边有一个雷:$dp[1][4]=1$。

  $\gamma.$本身有雷:$dp[1][3]=1$.

  $\delta.$为$?$:$dp[1][0]=dp[1][3]=dp[1][4]=1$(第一个位置不可能出现$1,2$两种情况)。

那么我们在来考虑过程中的转移,依然分类讨论(注意以下''中为题目中给出的棋盘的状态,而不是我上面列出的对于五种情况的编号):

  $\alpha.'0':$可以由$0,1$两种情况转移得来,即为:$dp[i][0]=dp[i-1][0]+dp[i-1][1]$。

  $\beta.'1':$则还分两种情况,分别是$1$和$4$,那么式子为:$dp[i][1]=dp[i-1][3]$和$dp[i][4]=dp[i-1][0]+dp[i-1][1]$。

  $\gamma.'2':$只能由$3$转移得来,即:$dp[i][2]=dp[i-1][3]$。

  $\delta.'*':$可以由$2,3,4$三种情况转移得来,即:$dp[i][3]=dp[i-1][2]+dp[i-1][3]+dp[i-1][4]$。

  $\epsilon.'?'$包含以上所有情况。

最后来考虑如何统计答案,因为最后一位不可能是$2$和$4$两种情况,所以答案即为:$dp[n][0]+dp[n][1]+dp[n][3]$。

时间复杂度:$\Theta(n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
char ch[1000001];
long long dp[1000001][5];
int main()
{
scanf("%s",ch+1);
int n=strlen(ch+1);
switch(ch[1])
{
case '0':dp[1][0]=1;break;
case '1':dp[1][4]=1;break;
case '*':dp[1][3]=1;break;
case '?':dp[1][0]=dp[1][4]=dp[1][3]=1;break;
}
for(int i=2;i<=n;i++)
switch(ch[i])
{
case '0':dp[i][0]=(dp[i-1][0]+dp[i-1][1])%1000000007;break;
case '1':dp[i][1]=dp[i-1][3];dp[i][4]=(dp[i-1][0]+dp[i-1][1])%1000000007;break;
case '2':dp[i][2]=dp[i-1][3];break;
case '*':dp[i][3]=(dp[i-1][2]+dp[i-1][3]+dp[i-1][4])%1000000007;break;
case '?':
dp[i][0]=(dp[i-1][0]+dp[i-1][1])%1000000007;
dp[i][1]=dp[i-1][3];
dp[i][3]=(dp[i-1][2]+dp[i-1][3]+dp[i-1][4])%1000000007;
dp[i][4]=(dp[i-1][0]+dp[i-1][1])%1000000007;
dp[i][2]=dp[i-1][3];
break;
}
printf("%lld",(dp[n][0]+dp[n][1]+dp[n][3])%1000000007);
return 0;
}

rp++

[CSP-S模拟测试]:mine(DP)的更多相关文章

  1. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  2. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  3. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  4. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  5. csp-s模拟测试98

    csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...

  6. csp-s模拟测试97

    csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...

  7. csp-s模拟测试95

    csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...

  8. csp-s模拟测试93

    csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...

  9. csp-s模拟测试92

    csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...

随机推荐

  1. cts-on-gsi测试流程

    测试前提: 1.发货user版本 2.selinux:Enable 3.连接ADB,stay awake 4.烧录XXX申请的key 5.外网环境(ipv6) ATV9测试准备(正常准备环境+fast ...

  2. 移动端安全 - 安卓Android - 工具相关

    渗透工具 drozer .安装文件解压后文件介绍 setup.exe ---安装 agent.apk ---用于调试 - 安装在安卓手机上 使用命令 . cd 到 drozer 安装目录 . adb ...

  3. 使用母版页的Web窗体不走Page_Load

    原因:母版页--->属性--->生成--->输出路径,这里我将它的默认/bin路径更改了,所以才导致使用此母版页的其它页面也不走Page_Load方法 解决:改回默认的输出路径

  4. Struts2+Ajax实现数据交互

    1.导入jar包 struts核心包: json需要的包: 2.配置web.xml <filter> <filter-name>struts2</filter-name& ...

  5. jvm性能监控(2)–JVM的监控工具jstat

    Jstat是JDK自带的一个轻量级工具,主要用JVM内建的指令对java应用程序的资源和性能进行实时的监控. openjdk没有jstat,jps等命令解决办法  执行以下命令即可:yum insta ...

  6. 【洛谷p2089】 烤鸡

    烤鸡[题目链接] 感觉我超废 关于算法:有很多很多算法吧,但自我感觉最重要的是递归的算法: SOLUTION: 首先忍不住要吐槽这个神仙数据: 嗯???定睛一看,它这数据范围莫不是白瞎了,因为每种配料 ...

  7. luoguP1505 [国家集训队]旅游(真的毒瘤)

    luogu P1505 [国家集训队]旅游 题目 #include<iostream> #include<cstdio> #include<cstdlib> #in ...

  8. Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)

                前几天就g+里面看到有人引用这篇博文.看了一下.受益颇多. 所以翻译过来,希望和大家一起学习.本人英语水平有限,假设有错,请大家指正. 原文地址(须要翻墙):http://ja ...

  9. Java-技术专区-设计模式-reactor模式

    模型:         反应器模式做法是:汽车是乘客访问的主体(Reactor),乘客上车后,到售票员(acceptor)处登记,之后乘客便可以休息睡觉去了,当到达乘客所要到达的目的地后,售票员将其唤 ...

  10. vue-froala-wysiwyg 富文本编辑器

    近期需要在vue3项目上做一个富文本编辑器,找了很多插件组件,最终决定用 froala.虽然不是免费的,但是功能实在是太强大了. froala 文档:https://www.froala.com/wy ...