Codeforces 404D Minesweeper 1D
题意:
给定字符串,其中’*’表示地雷,’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的更多相关文章
- CodeForces 404D Minesweeper 1D (DP)
题意:给定一个序列,*表示雷,1表示它旁边有一个雷,2表示它旁边有两个雷,0表示旁边没有雷,?表示未知,求有多少情况. 析:dp[i][j] 表示第 i 个放 j 状态,有多少种情况,然后很简单的DP ...
- 【codeforces 404D】Minesweeper 1D
[题目链接]:http://codeforces.com/problemset/problem/404/D [题意] 让你玩一个1维的扫雷游戏; 游戏的描述由数字0..2以及符号*表示; 分别表示这个 ...
- codeforces Minesweeper 1D
题意:就是挖地雷,给你一个字符串,‘*’代表地雷,‘1’代表在它的周围有1个地雷,‘2’代表在左右都有个地雷,‘?’代表不确定是不是地雷,可以是1,2,*,问你最后有几种方式确定所有的的地雷. 思路: ...
- Codeforces 404D [DP]
/* 我是一个习惯后悔,但是没办法忍受内疚感的二货== 这题是个无脑dp,但是比赛大概20min没出...其实最后5min我好好想想简单化边界条件,可以出的. 题意: 给你一个长度为1e6的由?*01 ...
- codeforces 984B Minesweeper
题意: 给出一个矩阵,如果一个格子是数字,那么与这个格子相邻的格子中有炸弹的数量必须等于这个格子中的数字: 如果一个格子是空地,那么这个格子的所有相邻的格子中就不能有炸弹. 判断这个矩阵是否合法. 思 ...
- Codeforces Global Round 1D(DP,思维)
#include<bits/stdc++.h>using namespace std;int dp[1000007][7][7];int cnt[1000007];int main(){ ...
- Codeforces 404E: Maze 1D(二分)
题意:指令“R”机器人会向右走一步,“L”是向左.起初机器人在0位置,可以在除了0以外的任何位置放障碍,如果机器人的指令将使它走到障碍上,那这一步他会保持不动.要求让机器人最终结束的那一步一定只走过一 ...
- 近期做的一些DP
UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...
- cf div2 237 D
D. Minesweeper 1D time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...
随机推荐
- js学习笔记-事件委托
通过事件委托,你可以把事件处理器绑定到父元素上,避免了把事件处理器添加到多个子级元素上.从而优化性能. 事件代理用到了事件冒泡和目标元素.而任何一个元素的目标元素都是一开始的那个元素. 这里首先要注意 ...
- [BZOJ1088][SCOI2005]扫雷Mine DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1088 记录下每一个格子对应左边格子放的雷的情况,然后dp转移就好了. #include&l ...
- 微信小程序组件解读和分析:十四、slider滑动选择器
slider滑动选择器组件说明: 滑动选择器. slider滑动选择器示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 ...
- vue框架的知识
基础:实例----组件----指令----选项-----计算属性----事件绑定----模板渲染-----内置动画 ---组件交互----路由. vuejs干了什么事情:数据渲染/数据同步 组件化/模 ...
- c++ 数组长度
数组长度求解 sizeof template <class T>int getArrayLen(T &array){ return (sizeof(array) / sizeof( ...
- 微信小程序中使用echarts
一.效果图 二.代码 import * as echarts from '../../component/ec-canvas/echarts'; const app = getApp(); var x ...
- 一个圆的移动 AE教程 速度曲线调节
AE里面速度的曲线调节 最终的小效果 两个关键点: 一:速度曲线调节 编辑速度图标,他的曲线是编辑速度的. 二:节点不要用贝塞尔曲线 编辑值图标,就是圆圈的x值y值的曲线.控制位置移动的. 选择一个节 ...
- vue-router 基本使用(vue工程化)
(1)概念: 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home按钮 => h ...
- MYSQL之错误代码----mysql错误代码与JAVA实现
原文地址:MYSQL之错误代码----mysql错误代码与JAVA实现作者:戒定慧 his chapter lists the errors that may appear when you call ...
- 2.C# 输入一个整数,求质因数
C# 输入一个整数,求质因数 List<int> results = new List<int>(); int number = Int32.Parse(Console.Rea ...