一个小的线性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. aircrack-ng wifi密码破解

    wifi密码破解 步骤1:查看网卡信息 ifconfig 找到你要用到的网卡 步骤2:启动网卡监听模式 airmon-ng start wlan0 我的是wlp2s0 步骤三:查看网卡变化 wlan0 ...

  2. .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础 -2

    上节中,我们初步的介绍了一下NetCore的一些基础知识,为了控制篇幅(其实也是因为偷懒),我将NetCore 基础分为两部分来写. 0.WebAPI 项目的建立 1..NetCore 项目执行(加载 ...

  3. B-线性代数-范数

    目录 范数 一.Lp范数 二.L0范数 三.L1范数 四.L2范数 五.L∞范数 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:ht ...

  4. JZ2440 u-boot-2016.11、linux-4.17和busybox-1.28.4移植笔记

    2018年5月份开始在JZ2440上陆续移植了u-boot-2016.11.u-boot-spl-2016.11.linux-4.17和busybox-1.28.4,其中linux-4.17和busy ...

  5. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  6. 代码审计准备之Thinkphp3

    0x01环境部署: 下载: 获取ThinkPHP的方式很多,官方网站(http://thinkphp.cn)是最好的下载和文档获取来源. 官网提供了稳定版本的下载:http://thinkphp.cn ...

  7. PHP 插入排序 -- 希尔排序

    1.希尔排序 -- Shell Insertion Sort 时间复杂度:数学家正在勤劳的探索! 适用条件: 直接插入排序的改进,主要针对移动次数的减少,这取决于"增量队列"的取值 ...

  8. LInux下npm install 安装失败问题

    现象: 今天公司自己动部署的Jenkins出现了问题,在执行npm install的时候,失败了,下载不到npm,在查阅了各种报错信息之后还是没有解决,发现用淘宝镜像进行安装时,也会有安装不成功的情况 ...

  9. 百万年薪python之路 -- 装饰器

    装饰器 1.1 开放封闭原则 开放封闭原则具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  10. CountDownLatch和CycliBarrier介绍

    一.CountDownLatch 它被用来同步一个或多个任务,强制他们等待其他任务完成,这就是闭锁. public CountDownLatch(int count) { if (count < ...