【题目链接】:http://codeforces.com/problemset/problem/404/D

【题意】



让你玩一个1维的扫雷游戏;

游戏的描述由数字0..2以及符号*表示;

分别表示这个格子的相邻的两个格子里面有几个炸弹;以及炸弹;

然后挖一些空;

问你有多少种填满的方案;

【题解】



dp[i][1] 表示前i个位置,第i个位置放0的方案数

dp[i][2] 表示钱i个位置,第i个位置放1,前一位没炸弹的方案数

dp[i][3] …..放1,前一位有炸弹…..

dp[i][4] …..放2….

dp[i][5] ….放炸弹….

根据每一位是什么进行转移就可以了;

转移也很容易想的;

然后初值根据s[1]的值来置;



【Number Of WA】



3



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("D:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e6+100;
const int MOD = 1e9+7; char s[N];
int dp[N][6],ans,n; inline void add(int &a,int &b){
a+=b;
if (a>=MOD) a-=MOD;
} int main(){
//Open();
scanf("%s",s+1);
if (s[1]=='0'){
dp[1][1] = 1;
}else if (s[1]=='1'){
dp[1][2] = 1;
}else if (s[1]=='2'){
//dp[1][4] = 1;
}else if (s[1]=='*'){
dp[1][5] = 1;
}else{
dp[1][1] = dp[1][2] = dp[1][5] = 1;
}
n = (int) strlen(s+1);
//dp[i][1] 放0
//dp[i][2] 放1,前一位没炸弹
//dp[i][3] 放1,前一位有炸弹
//dp[i][4] 放2
//dp[i][5] 放炸弹 rep1(i,2,n){
if (s[i]=='0'){
add(dp[i][1],dp[i-1][1]);
add(dp[i][1],dp[i-1][3]);
}else if (s[i]=='1'){
add(dp[i][2],dp[i-1][1]);
add(dp[i][2],dp[i-1][3]);
add(dp[i][3],dp[i-1][5]);
}else if (s[i]=='2'){
add(dp[i][4],dp[i-1][5]);
}else if (s[i]=='*'){
add(dp[i][5],dp[i-1][2]);
add(dp[i][5],dp[i-1][4]);
add(dp[i][5],dp[i-1][5]);
}else if (s[i]=='?'){
add(dp[i][1],dp[i-1][1]);
add(dp[i][1],dp[i-1][3]);
add(dp[i][2],dp[i-1][1]);
add(dp[i][2],dp[i-1][3]);
add(dp[i][3],dp[i-1][5]);
add(dp[i][4],dp[i-1][5]);
add(dp[i][5],dp[i-1][2]);
add(dp[i][5],dp[i-1][4]);
add(dp[i][5],dp[i-1][5]);
}
}
add(ans,dp[n][1]),add(ans,dp[n][3]),add(ans,dp[n][5]);
cout << ans << endl;
return 0;
}

【codeforces 404D】Minesweeper 1D的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 255D】Mr. Bender and Square

    [题目链接]:http://codeforces.com/problemset/problem/255/D [题意] 给你一个n*n的方框; 给你一个方块;(以下说的方块都是单位方块) 每一秒钟,可以 ...

  3. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  4. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  5. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  6. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  7. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  8. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  9. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

随机推荐

  1. [置顶] openHAB 部分代码结构 UML 图

    openHAB 部分代码结构 UML 图 ModelRepository: ItemRegistry: ItemUIProvider: WebAppServlet:

  2. 基于better-scroll封装一个上拉加载下拉刷新组件

    1.起因 上拉加载和下拉刷新在移动端项目中是很常见的需求,遂自己便基于better-scroll封装了一个下拉刷新上拉加载组件. 2.过程 better-scroll是目前比较好用的开源滚动库,提供很 ...

  3. UVALive-8072 Keeping On Track 树形dp 联通块之间缺失边的个数

    题目链接:https://cn.vjudge.net/problem/UVALive-8072 题意 给出n+1个点和n条边,每对点之间只能存在一条边. 现在要找出一个节点,使得去掉这个点后,所剩每对 ...

  4. done

  5. Label,PushButton,ToolButton 实现动态图片按钮,Label显示gif动画

    .h文件 public: explicit event(QWidget *parent = 0); ~event(); QImage image; QLabel *label; QLabel *lab ...

  6. unity 显示、隐藏Android导航栏

    1.下面的返回.home栏可用Screen.fullScreen控制 2.导航栏的显示和隐藏用下面代码控制 private AndroidJavaObject currentActivity { ge ...

  7. java源码之HashMap和HashTable的异同

    代码版本 JDK每一版本都在改进.本文讨论的HashMap和HashTable基于JDK 1.7.0_67 1. 时间 HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2.从 ...

  8. 洛谷——P2483 [SDOI2010]魔法猪学院

    https://www.luogu.org/problem/show?pid=2483 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的 ...

  9. [博弈] hdu 3683 Gomoku

    题意: 两个人下五子棋.给你现有棋盘,推断在三步之内的胜负情况. 输出分为几种. 1.棋盘不合法 2.黑或白在第一步赢下在(x,y)点,多个输出x最小的.y最小的. 3.输在第二步 4.黑或白在第三步 ...

  10. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)

    3295: [Cqoi2011]动态逆序对 题目:传送门 题解: 刚学完cdq分治,想起来之前有一道是树套树的题目可以用cdq分治来做...尝试一波 还是太弱了...想到了要做两次cdq...然后伏地 ...