Date:2019/10/13
Degree of difficulty:Universal
Original question:P2327 [SCOI2005]扫雷

  • 原题与改编


10.13月考【爆零祭】
T103466 新扫雷游戏

怎么说呢,作为一个没有经历过多少比赛的蒟蒻,今天的考试还是有点虚的,毕竟没有多少做题经验,有些步骤还是有些生疏,做题时候也有些慌乱,没有把握好节奏。
再有一点,就是生活经验不是很多,连扫雷都没玩过,一个坑竟然不能放3个雷??
所以要把这种有关游戏的题目和中国传统的游戏方式(与现在学习知识有关的)多看看看

杨老师说:与其蜻蜓点水,每个题20、30分,还不如好好的沉下心来,AC一道题

目录

  1. 本题思路
  2. 数组递推
  3. 深搜
  4. 一些学会的东西

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来进行动态转移。

  1. 若ai==0,则i-1,i,i+1必须分别对应 0,0,0,
    所以这种情况下转移方程: dp[i][0][0]=dp[i-1][0][0]
  2. 若ai==3,则i-1,i,i+1必须分别对应 1,1,1
    所以这种情况下转移方程 dp[i][1][1]=dp[i-1][1][1]
  3. 若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]

  1. 若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 学到的一些东西

  1. 输入输出的写法
 freopen("XX(文件名).in","r",stdin);//r is readfreopen("XX(文件名).out","w",stdout);// w is write

看注释会记得牢一点
2. 扫雷一个格子放0或者1个
3. 数组不清零,爆零两行泪

[DFS/递推/DP] 2327 [SCOI2005] 扫雷 ( 普及+/提高相关推荐

  1. 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)

    整理的算法模板合集: ACM模板 题目传送门 三段题面,只有第三段是有用的-前两段又长单词又难懂,就是在讲故事...不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句 ...

  2. 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)

    这时yxc上课时讲解的截图. 一般用到tarjan算法的题目步骤都非常相似: tarjan算法 缩点,建图(这里要判重) 按照拓扑序递推(这里缩点以后逆向就已经是拓扑序了)/ 循环遍历新图求解答案. ...

  3. hdu1978(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 分析: 递推DP. dp[][]表示可以到达改点的方法数. 刚开始: 外循环扫描所有点dp[x] ...

  4. 递推DP URAL 1119 Metro

    题目传送门 1 /* 2 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 3 递推DP:仿照JayYe,处理的很巧妙, ...

  5. 递推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 ...

  6. 递推DP UVA 1366 Martian Mining

    题目传送门 1 /* 2 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 3 到达边界后把沿途路上的权值相加求和使最大 4 DP:这是道递推题, ...

  7. POJ 1661 Help Jimmy(递推DP)

    思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...

  8. 【BZOJ2152】聪聪可可,dfs+递推/点分治

    传送门 写在前面:╯﹏╰ 思路:刚开始char哥在做这个题,提供了不用点分治而是树上递推的做法,然后我就先调出来了-- 对树进行dfs,f[u][y]表示以x为根的子树中,与u距离为y的点(mod 3 ...

  9. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

最新文章

  1. Single Number II
  2. 成功解决ERROR: Could not install packages due to an EnvironmentError: [Errno 28] No space left on device
  3. ubuntu环境下php安装amqp扩展
  4. 【2016年第3期】大数据治理的数据模式与安全
  5. SpringMVC框架第三天
  6. shell脚本:判断本地和远程文件是否存在
  7. datatable中使用linq的条件或_条件格式中使用公式,请提前备好晕车药
  8. 001_JavaScript数组常用方法总结及使用案例
  9. SQL“多字段模糊匹配关键字查询”
  10. php包含大马执行,对于某个PHP大马的分析
  11. 青少年编程Playgrounds之一
  12. python3 sorted自定义排序的函数
  13. linux rpm -qa|grep -i mysql_【LINUX】linux中rpm是什么意思
  14. 计算机分屏解决方案,电脑一机多屏显示解决方案
  15. 第二章 蜕变!上古剑修!
  16. luogu 3374
  17. C++ 引用! 他是坤坤也是鸡哥
  18. 什么是欧拉角/姿态角?
  19. 菊风云 | 音视频社交崛起的背后
  20. QT开发学习-第一章-QT简介

热门文章

  1. 盛大开幕!2019达索系统3D体验高峰论坛……
  2. 华为 android 5.0系统下载地址,华为Mate8 EMUI5.0系统专用官方原版recovery下载和刷入...
  3. h5怎么区分在ios、安卓、微信环境下?怎么调用原生函数
  4. 系统的数据一致性到底是在说什么?我到今天才算真明白了
  5. 中国电子学会2022年12月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)
  6. 【Python】socket编程——使用UDP协议打造在线时间服务器
  7. 基于apollo实现配置灰度发布
  8. bcd码 php,转载:BCD码
  9. 春游 C++(半对)(最小字典序)
  10. 【Python】爬取百度图片和必应图片