一个小的线性dp。方法很多,八仙过海各显神通。

我想讲一下我的:

 #include<cstdio>
#define mod 1000000007
char s[];int dp[][][],n;//是不是雷,右边有没有雷
int main(){
scanf("%s",s+);
for(n=;s[n];n++);n--;
dp[][][]=dp[][][]=;
for(int i=;i<=n;++i)
if(s[i]=='')dp[i][][]=dp[i-][][];
else if(s[i]=='')dp[i][][]=dp[i-][][],dp[i][][]=dp[i-][][];
else if(s[i]=='')dp[i][][]=dp[i-][][];
else if(s[i]=='*')dp[i][][]=dp[i][][]=(dp[i-][][]+dp[i-][][])%mod;
else {
dp[i][][]=dp[i-][][];//
(dp[i][][]+=dp[i-][][])%=mod;dp[i][][]=dp[i-][][];//
(dp[i][][]+=dp[i-][][])%=mod;//
dp[i][][]=dp[i][][]=(dp[i-][][]+dp[i-][][])%mod;//*
}
printf("%d\n",(dp[n][][]+dp[n][][])%mod);
}

先扔在这里

我的dp含义是:dp[i][this][next]表示考虑了第i位后,this和next位置上有没有雷的方案数。

思考一下:如果你知道前面的一位是什么,这一位是什么,你就能推断出下一位是什么。

因为在一维扫雷里只有相邻的3个格子之间有约束作用。

所以我们来考虑dp[i][t][n]由什么转移而来:

如果第i位是个’0‘,那么它不是雷,它的前面一位不能是雷,后面也不能是,则dp[i][][]=dp[i-1][][](注意文字与代码的颜色对应)

如果是个’1‘,那么它不是雷,分2种情况:

它前面有而后面没有:dp[i][][]=dp[i-1][][];

它前面没有而后面有:dp[i][][]=dp[i-1][][];

如果是个’2‘,那么它不是雷,而前后都有雷:dp[i][][]=dp[i-1][][];

如果它是个雷,那么前面随意。。后面也随意。。:dp[i][][1]=dp[i][][0]=dp[i-1][0][]+dp[i-1][1][];

如果是个问号就把上面这些状态都弄一遍就好。

初状态dp[0][0][0]=dp[0][0][1]=1因为第0个格子上没有雷而它的右边有没有再说并不会被第0个格子限制。

末状态dp[n][1][0]+dp[n][0][0]因为并不在意第n个格子上有没有雷(如果它不合法那么dp值为0),而第n+1个格子上没有雷。

完毕!

mine:dp的更多相关文章

  1. UVa 10934 Dropping water balloons:dp(递推)

    题目链接:https://vjudge.net/problem/27377/origin 题意: 有一栋n层高的楼,并给你k个水球.在一定高度及以上将水球扔下,水球会摔破:在这个高度以下扔,水球不会摔 ...

  2. HDU 1028 Ignatius and the Princess III:dp or 母函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1028 题意: 给你一个正整数n,将n拆分成若干个正整数之和,问你有多少种方案. 注:"4 = ...

  3. AtCoder ARC097C Sorted and Sorted:dp

    传送门 题意 有 $ 2n $ 个球排成一行,其中恰好有 $ n $ 个白球和 $ n $ 个黑球.每个球上写着数字,其中白球上的数字的并集为 $ \lbrace 1 \dots n\rbrace $ ...

  4. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  5. BZOJ 1677 [Usaco2005 Jan]Sumsets 求和:dp 无限背包 / 递推【2的幂次方之和】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1677 题意: 给定n(n <= 10^6),将n分解为2的幂次方之和,问你有多少种方 ...

  6. BZOJ 2023 [Usaco2005 Nov]Ant Counting 数蚂蚁:dp【前缀和优化】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2023 题意: 有n个家族,共m只蚂蚁(n <= 1000, m <= 1000 ...

  7. 地精部落:dp

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  8. [CSP-S模拟测试]:mine(DP)

    题目描述 有一个$1$维的扫雷游戏,每个格子用$*$表示有雷,用$0/1/2$表示无雷并且相邻格子中有$0/1/2$个雷.给定一个仅包含$?$.$*$.$0$.$1$.$2$的字符串$s$,问有多少种 ...

  9. 洛谷 P1466 集合 Subset Sums Label:DP

    题目描述 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子 ...

随机推荐

  1. BZOJ 1345: [Baltic2007]序列问题Sequence

    1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1180  Solved: 633[Subm ...

  2. linux ln命令 建立文件夹桌面快捷方式

    指令如下: sudo ln -s /root/myhack/ /root/Desktop 以上指令是创建软链接到桌面. 指令解析: ln -s是创建软链接指令,如果不加-s则是创建硬链接.

  3. prototype与 _proto__的关系

    prototype与 __ proto__ 都是在这个过程中催生的产物,我们一会儿马上讨论,在这之...做对象即可,那javascript种究竟是通过什么来明确继承关系的呢. 一.构造函数: 构造函数 ...

  4. Github 高级搜索功能

    参考文章链接:https://zhuanlan.zhihu.com/p/55294261 GitHub 提供高级搜索方式. 一.明确搜索仓库标题.仓库描述.README 1.只想查找仓库名称包含XX的 ...

  5. linux下mqtt-client

    CPATH += ../embe_mqtt/MQTTClient/srcPSRTPATH = ../embe_mqtt/MQTTPacket/src LOADPATH += -I$(CPATH)LOA ...

  6. React学习系列之(1)简单的demo(React脚手架)

    1.什么是React? React是一个一个声明式,高效且灵活的用于构建用户界面的JavaScript库.React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 ...

  7. python中生成器与迭代器

    可迭代对象:一个实现了iter方法的对象是可迭代的 迭代器:一个实现了iter方法和next方法的对象就是迭代器 生成器都是Iterator对象,但list.dict.str虽然是Iterable(可 ...

  8. (转载)linux命令-sed

    原文地址:https://www.cnblogs.com/zhangzongjian/p/10708222.html

  9. 百万年薪python之路 -- 软件的开发规范

    一. 软件的开发规范 什么是开发规范?为什么要有开发规范呢? 你现在包括之前写的一些程序,所谓的'项目',都是在一个py文件下完成的,代码量撑死也就几百行,你认为没问题,挺好.但是真正的后端开发的项目 ...

  10. wpf 依赖强制回调

    依赖属性的强制转换加回调,后期自己再改 using System; using System.Collections.Generic; using System.Diagnostics; using ...