[DFS/递推/DP] 2327 [SCOI2005] 扫雷 ( 普及+/提高
Date:2019/10/13
Degree of difficulty:Universal
Original question:P2327 [SCOI2005]扫雷
- 原题与改编
10.13月考【爆零祭】
T103466 新扫雷游戏
怎么说呢,作为一个没有经历过多少比赛的蒟蒻,今天的考试还是有点虚的,毕竟没有多少做题经验,有些步骤还是有些生疏,做题时候也有些慌乱,没有把握好节奏。
再有一点,就是生活经验不是很多,连扫雷都没玩过,一个坑竟然不能放3个雷??
所以要把这种有关游戏的题目和中国传统的游戏方式(与现在学习知识有关的)多看看看
杨老师说:与其蜻蜓点水,每个题20、30分,还不如好好的沉下心来,AC一道题
目录
- 本题思路
- 数组递推
- 深搜
- 一些学会的东西
Ox00 本题思路
这道题我们很快的就能知道
右边一列的每一个数是等于左边相邻的3列的和的
所以得到公式b[i]=a[i]+a[i-1]+a[i+1];
但是我们现在已知的东西是右边的数,左边的的前两列,所以问题就变成了求第三列的数
移项易得a[i]=b[i]-a[i-1]-a[i+2];
所以用这个递推公式
但注意!!!
每个格子只能放1~2个雷 (没玩过扫雷哭晕)
所以第一个格子只有三种情况
1. 有0个雷,那么第一列第一行第二行都是0;0+0=0
2. 有一个雷
2.1 第一列第一行是1,第二行是0;1+0=1
2.2 第一列第一行是0,第二行1;0+1=1
3. 有两个雷,那么第一列第一行第二行都是1;1+1=2
所以每次加减以后都要判断它是不是1或者2,成功剪枝;
还要在最后一个点的时候判断a[n-1][1]+a[n][1]==a[n][2]
如下
for(int i = 3; i <= n; i++){//dfs程序 a[i][1] = a[i-1][2] - a[i-1][1] - a[i-2][1];if(a[i][1] > 1 || a[i][1] < 0){fl = 1 ; break;}}if(fl==0&&a[n-1][1]+a[n][1]==a[n][2])vie++;
Ox01 深搜
dfs的思路就是每个格子只能放0个或者1个
所以搜索就好
但是我这个剪枝没有剪好
所以先不放代码了
(未完待续)
Ox02 DP
这道题也可用DP做
详情请见
这道题根据我的老师的思路是定义一个三维数组dp[i][j][k]
来做动态规划
其中j表示第i行的地雷数,k表示第i+1行的地雷数,
而dp[i][j][k]代表当前的组数。
初始条件为dp[0][0][0]=dp[0][0][1]=1
即第1行为0个或为1个时都有一种可能。然后根据第i行给的ai来进行动态转移。
- 若ai==0,则i-1,i,i+1必须分别对应 0,0,0,
所以这种情况下转移方程:dp[i][0][0]=dp[i-1][0][0]
。 - 若ai==3,则i-1,i,i+1必须分别对应 1,1,1
所以这种情况下转移方程dp[i][1][1]=dp[i-1][1][1]
。 - 若ai==1,则分为三种情况
i-1 i i+1 动转方程
1 0 0 dp[i][0][0]=dp[i-1][1][0]
0 1 0 dp[i][1][0]=dp[i-1][0][1]
0 0 1 dp[i][0][1]=dp[i-1][0][0]
- 若ai==2,也是三种情况
i-1 i i+1 动转方程
1 1 0 dp[i][1][0]=dp[i-1][1][1]
0 1 1 dp[i][1][1]=dp[i-1][0][1]
1 0 1 dp[i][0][1]=dp[i-1][1][0]
记得开全局变量因为这样不合法的转移就全部是0了。 在最后输出的答案为dp[n][1][0]+dp[n][0][0],这是第n行有地雷或无地雷的数量的总和(n+1不能取)。 大概就是这样详情请见代码,我觉得挺简洁的。
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int n,a[10005];
int dp[10005][2][2];
int main(){cin>>n;for (int i=1;i<=n;i++) cin>>a[i];//读入数据dp[0][0][0]=dp[0][0][1]=1;//初始化for (int i=1;i<=n;i++){//状态转移if (a[i]==0){dp[i][0][0]=dp[i-1][0][0];}if (a[i]==3){dp[i][1][1]=dp[i-1][1][1];}if (a[i]==2){dp[i][1][1]=dp[i-1][0][1];dp[i][1][0]=dp[i-1][1][1];dp[i][0][1]=dp[i-1][1][0];}if (a[i]==1){dp[i][0][1]=dp[i-1][0][0];dp[i][1][0]=dp[i-1][0][1];dp[i][0][0]=dp[i-1][1][0];}}cout<<dp[n][1][0]+dp[n][0][0];
}
//作者: momo5440 更新时间: 2019-03-20 23:37
OxFF 学到的一些东西
- 输入输出的写法
freopen("XX(文件名).in","r",stdin);//r is readfreopen("XX(文件名).out","w",stdout);// w is write
看注释会记得牢一点
2. 扫雷一个格子放0或者1个
3. 数组不清零,爆零两行泪
[DFS/递推/DP] 2327 [SCOI2005] 扫雷 ( 普及+/提高相关推荐
- 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)
整理的算法模板合集: ACM模板 题目传送门 三段题面,只有第三段是有用的-前两段又长单词又难懂,就是在讲故事...不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句 ...
- 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)
这时yxc上课时讲解的截图. 一般用到tarjan算法的题目步骤都非常相似: tarjan算法 缩点,建图(这里要判重) 按照拓扑序递推(这里缩点以后逆向就已经是拓扑序了)/ 循环遍历新图求解答案. ...
- hdu1978(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 分析: 递推DP. dp[][]表示可以到达改点的方法数. 刚开始: 外循环扫描所有点dp[x] ...
- 递推DP URAL 1119 Metro
题目传送门 1 /* 2 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 3 递推DP:仿照JayYe,处理的很巧妙, ...
- 递推DP HDOJ 5459 Jesus Is Here
题目传送门 题意:简单来说就是sn = sn-1 + sn-2递推而来,求其中所有c字符的:∑i<j:sn[i..i+2]=sn[j..j+2]=''cff"(j−i) mod 530 ...
- 递推DP UVA 1366 Martian Mining
题目传送门 1 /* 2 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 3 到达边界后把沿途路上的权值相加求和使最大 4 DP:这是道递推题, ...
- POJ 1661 Help Jimmy(递推DP)
思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...
- 【BZOJ2152】聪聪可可,dfs+递推/点分治
传送门 写在前面:╯﹏╰ 思路:刚开始char哥在做这个题,提供了不用点分治而是树上递推的做法,然后我就先调出来了-- 对树进行dfs,f[u][y]表示以x为根的子树中,与u距离为y的点(mod 3 ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
最新文章
- Single Number II
- 成功解决ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device
- ubuntu环境下php安装amqp扩展
- 【2016年第3期】大数据治理的数据模式与安全
- SpringMVC框架第三天
- shell脚本:判断本地和远程文件是否存在
- datatable中使用linq的条件或_条件格式中使用公式,请提前备好晕车药
- 001_JavaScript数组常用方法总结及使用案例
- SQL“多字段模糊匹配关键字查询”
- php包含大马执行,对于某个PHP大马的分析
- 青少年编程Playgrounds之一
- python3 sorted自定义排序的函数
- linux rpm -qa|grep -i mysql_【LINUX】linux中rpm是什么意思
- 计算机分屏解决方案,电脑一机多屏显示解决方案
- 第二章 蜕变!上古剑修!
- luogu 3374
- C++ 引用! 他是坤坤也是鸡哥
- 什么是欧拉角/姿态角?
- 菊风云 | 音视频社交崛起的背后
- QT开发学习-第一章-QT简介
热门文章
- 盛大开幕!2019达索系统3D体验高峰论坛……
- 华为 android 5.0系统下载地址,华为Mate8 EMUI5.0系统专用官方原版recovery下载和刷入...
- h5怎么区分在ios、安卓、微信环境下?怎么调用原生函数
- 系统的数据一致性到底是在说什么?我到今天才算真明白了
- 中国电子学会2022年12月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)
- 【Python】socket编程——使用UDP协议打造在线时间服务器
- 基于apollo实现配置灰度发布
- bcd码 php,转载:BCD码
- 春游 C++(半对)(最小字典序)
- 【Python】爬取百度图片和必应图片