题意:

给定字符串,其中’*’表示地雷,’1’表示左/右边有一个地雷相邻,’2’表示左右两边均有地雷相邻,’0’表示左右均无地雷相邻,’?’表示待定,可填入0,1,2或者地雷,有多少种表示方法使字母串满足规定。

分析:

不难想到用dp[i][j]其中j为0,1,2,3(即四种状态),表示下标为i的元素为j状态时,前i+1个字符满足规定的种数。起初这样做,每次都还需要对前一个元素为’1’时进行特殊处理,要分两种情况,不如直接在dp数组中增加一个状态,表示起来也更清晰,即dp[i][j]中j可为0,1,2,3,4,其中0表示字符串下标为i的元素为0,1表示元素为1且前一个元素为地雷,2表示元素为1且前一个元素非地雷(0/1),3表示元素为地雷,4表示元素为’2’。

代码:

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1e6 + 5;
long long mod = 1000000007;
long long dp[maxn][5];
int main (void)
{
string a;cin>>a;
memset(dp,0,sizeof(dp));
if(a[0]=='0') dp[0][0] = 1;
else if(a[0] =='1') dp[0][2] = 1;
else if(a[0] =='*') dp[0][3] = 1;
else if(a[0]=='?') {
dp[0][0] = 1;
dp[0][3] = 1;
dp[0][2] = 1;
} for(int i = 1; i < a.length();i++){
if(a[i]=='0') {
dp[i][0] = (dp[i-1][1] + dp[i-1][0])%mod;
}else if(a[i] == '1'){
dp[i][1] = dp[i-1][3]%mod;
dp[i][2] = (dp[i-1][1]+dp[i-1][0])%mod;
}else if(a[i] == '*'){
dp[i][3] = (dp[i-1][4]+dp[i-1][2]+dp[i-1][3])%mod;
}else if(a[i] =='?'){
dp[i][0] = (dp[i-1][1] + dp[i-1][0])%mod;
dp[i][1] = dp[i-1][3]%mod;
dp[i][2] = (dp[i-1][1]+dp[i-1][0])%mod;
dp[i][3] = (dp[i-1][2]+dp[i-1][4]+dp[i-1][3])%mod;
dp[i][4] = dp[i-1][3]%mod;
}else if(a[i] == '2'){
dp[i][4] = dp[i-1][3]%mod;
}
// for(int j= 0; j < 5; j++) cout<<dp[i][j]<<' ';
//cout<<endl;
} int len = a.length()-1;
long long tot=(dp[len][0]+dp[len][1]+dp[len][3])%mod;
cout<<tot<<endl;
}

Codeforces 404D Minesweeper 1D的更多相关文章

  1. CodeForces 404D Minesweeper 1D (DP)

    题意:给定一个序列,*表示雷,1表示它旁边有一个雷,2表示它旁边有两个雷,0表示旁边没有雷,?表示未知,求有多少情况. 析:dp[i][j] 表示第 i 个放 j 状态,有多少种情况,然后很简单的DP ...

  2. 【codeforces 404D】Minesweeper 1D

    [题目链接]:http://codeforces.com/problemset/problem/404/D [题意] 让你玩一个1维的扫雷游戏; 游戏的描述由数字0..2以及符号*表示; 分别表示这个 ...

  3. codeforces Minesweeper 1D

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

  4. Codeforces 404D [DP]

    /* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...

  5. codeforces 984B Minesweeper

    题意: 给出一个矩阵,如果一个格子是数字,那么与这个格子相邻的格子中有炸弹的数量必须等于这个格子中的数字: 如果一个格子是空地,那么这个格子的所有相邻的格子中就不能有炸弹. 判断这个矩阵是否合法. 思 ...

  6. Codeforces Global Round 1D(DP,思维)

    #include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){  ...

  7. Codeforces 404E: Maze 1D(二分)

    题意:指令“R”机器人会向右走一步,“L”是向左.起初机器人在0位置,可以在除了0以外的任何位置放障碍,如果机器人的指令将使它走到障碍上,那这一步他会保持不动.要求让机器人最终结束的那一步一定只走过一 ...

  8. 近期做的一些DP

    UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...

  9. cf div2 237 D

    D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...

随机推荐

  1. 开源项目:JEECG

    工程下载:https://github.com/zymqqc/jeecg-1

  2. Array和ArrayList之间的区别

    . Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小),而ArrayList可以只是先声明. . Array只能存储同构的对象,而ArrayList可以存储异构的对象. 同构的对 ...

  3. Jvisualvm--JAVA性能分析工具

    JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...

  4. 关于mapState和mapMutations和mapGetters 和mapActions辅助函数的用法及作用(二)-----mapMutations

    在组件中提交Mutations: import { mapState, mapMutations } from 'vuex' export default { data() { return { ms ...

  5. vue2.0自定义事件

    我们知道父组件是使用props传递数据给子组件,如果子组件要把数据传递回去,怎么办? 那就是要自定义事件!使用v-on绑定自定义事件 每个Vue实例都实现了事件接口(Events interface) ...

  6. Q币直充-迅银渠道商(php 面向对象类)

    Q币直充的一个类实现 1 <?php /** * DEC : 迅银Q币直充 * User: David Wang * Time: 2018/5/24 下午1:09 */ namespace go ...

  7. CentOS 初体验十四:阿里云安装Gitlab

    网址:https://about.gitlab.com/install/#centos-7 https://blog.csdn.net/zhaoyanjun6/article/details/7914 ...

  8. hdfs深入:09、获取分布式文件系统客户端的几种方式

    FileSystem是一个抽象类:获取一个抽象类有两种方式:第一种:看这个抽象类有没有提供什么方法返回他本身第二种:找子类 具体代码如下: /** * 通过url注册的方式访问hdfs,了解,不会用到 ...

  9. thinkphp5中extend的使用?

    1.创建处理数组的类ArrayList.php <?php /** * ArrayList实现类 * @author liu21st <liu21st@gmail.com> */ c ...

  10. Class加载顺序

    原文:https://blog.saymagic.cn/2017/07/01/class-common-question.html 类的初始化顺序是怎样的? 我们尝试从class文件中找到答案.来看这 ...