[H博弈论] lc1728. 猫和老鼠 II(博弈论+记忆化搜索+周赛224_4)
文章目录
- 1. 题目来源
- 2. 题目解析
1. 题目来源
链接:1728. 猫和老鼠 II
2. 题目解析
棋盘类博弈论问题大多数采用记忆化搜索来进行优化。有效的状态空间没那么多,大多数都 break
或者 return
掉了。
思路:
- 理解最优策略下猫和老鼠两者的 必胜态和必败态 的意思。
- 这里的
k
不能入题取到最大限制 1000,不然妥妥超时,1 亿的计算量…在此由于采用记忆化搜索且猜测死循环应该发生在 200 步左右,故就取经验值 200 即可。 - 老鼠的必胜态转移过程中,如果发生下个状态使得老鼠和猫的位置一样,则老鼠当前状态应该是必败的,但是这种状态的无效的,因为目前进行的是必胜态的转移。老鼠也不是傻老鼠,不会自投罗网。只有当所有的必胜态均无法转移时,才会将当前状态判定为必败态,所以不能将下面的一种状态到达必败态的这种状态就将当前状态直接定义为必败态。必胜态的转移只需要一个!理解这点很重要!
- 枚举状态转移的方向和步长时需要注意下方向数组与步数的相乘即可。
博弈论问题是个挺难的知识点,稍微偏冷门,从 224 场周赛排名也能看出来,全场只 AK
了 22 位佬,所以第四题出个博弈论还是挺值得注意的。尤其是棋盘类博弈论问题,几乎记忆化搜搜成了标配!
本题也是非常经典的博弈论问题,好题!
- 时间复杂度:O(4n×n4k)O(4n \times n^4k)O(4n×n4k)。
- 空间复杂度:O(n4k)O(n^4k)O(n4k)
代码:
int f[8][8][8][8][200];class Solution {public:int n, m, cj, mj;vector<string> g;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int dp(int cx, int cy, int mx, int my, int k) {if (k >= 200) return 0;auto& v = f[cx][cy][mx][my][k];if (v != -1) return v; // 如果之前搜过 v 则直接返回if (k & 1) { // 奇数猫走,偶数老鼠走,题目要求老鼠先走for (int i = 0; i < 4; i ++ ) {for (int j = 0; j <= cj; j ++ ) {int x = cx + dx[i] * j, y = cy + dy[i] * j; // 下一个状态进行转移if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] == '#') break; // 越界或撞墙均为无效转移if (x == mx && y == my) return v = 0; // 抓到老鼠,猫必胜if (g[x][y] == 'F') return v = 0; // 找到食物,猫必胜if (!dp(x, y, mx, my, k + 1)) return v = 0; // 转移状态如果为猫必胜,则当前即为猫必胜}}return v = 1; // 否则猫必败} else {for (int i = 0; i < 4; i ++ ) {for (int j = 0; j <= mj; j ++ ) {int x = mx + dx[i] * j, y = my + dy[i] * j;if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] == '#') break;if (x == cx && y == cy) continue; // 如果老鼠走到猫的位置,这个状态不要转移,最优策略下为无效状态if (g[x][y] == 'F') return v = 1;if (dp(cx, cy, x, y, k + 1)) return v = 1; // 转移状态如果为老鼠必胜,则当前即为老鼠必胜}}return v = 0;}}bool canMouseWin(vector<string>& grid, int catJump, int mouseJump) {g = grid;n = g.size(), m = grid[0].size(), cj = catJump, mj = mouseJump;int cx, cy, mx, my;for (int i = 0; i < n; i ++ ) for (int j = 0; j < m; j ++ )if (g[i][j] == 'C') cx = i, cy = j;else if (g[i][j] == 'M') mx = i, my = j;memset(f, -1, sizeof f);return dp(cx, cy, mx, my, 0);}
};
[H博弈论] lc1728. 猫和老鼠 II(博弈论+记忆化搜索+周赛224_4)相关推荐
- 博弈论 (入门)CSU2209 记忆化搜索
2209: Game Submit Page Summary Time Limit: 1 Sec Memory Limit: 256 Mb Submitted: 10 ...
- 博弈论(2)DP/记忆化搜索
博弈问题的话,假设两个人都极度聪明,都会采取最优策略,那么就是也知道了对方也和自己一样聪明,我采取最优策略后,对方也会根据当前状态做出最优策略,简而言之,就是每个玩家都从第一步棋看到了最后一步棋. 先 ...
- 【力扣·每日一题】913. 猫和老鼠(C++ 记忆化搜索 博弈)
linkk 题意: 思路: 采用记忆化搜索,dp[t][x][y]表示走了t步后老鼠在x猫在y时的状态. 初始将dp数组都设为-1,表示未被经过. dfs搜索,传的参数未当前的步数t,老鼠的位置x,猫 ...
- 动态规划5:动态规划与记忆化搜索
本期题目: 单词拆分 单词拆分II 大礼包 记忆化搜索与狭义的动态规划 前面我们讲的动态规划很广义的思想,从起始时刻到终止时刻,每一步都要按照最优原则走,按照这个原则会产生一个迭代式,称为动态规划迭代 ...
- bzoj3895: 取石子(博弈论,记忆化搜索)
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MB Submit: 361 Solved: 177 [Submit][Status][Discuss] ...
- poj 1085 Triangle War 博弈论+记忆化搜索
思路:总共有18条边,9个三角形. 极大极小化搜索+剪枝比较慢,所以用记忆化搜索!! 用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解. 代码如下: 1 #include<i ...
- 【codevs3153】【BZOJ3895】取石子游戏,博弈论之记忆化搜索
传送门1 传送门2(权限) 思路: 之前模拟赛的一道题 当时在硬刚T1的正解,而没有写暴力 考虑局面没有石子堆是1的情况 那么显然只考虑总数的奇偶就可以判断答案了 因为必胜方拼命合并石子堆,必败方即使 ...
- 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起&qu ...
- 专题7:动态规划 记忆化搜索
1. 什么是动态规划 ? 这是算法导论对动态规划的定义: 动态规划( dynamic programming,常简称为 dp ) 与分治方法相似,都是通过组合子问题的解来求解原问题( 在这里,&quo ...
最新文章
- 图片不显示问题 图片url监测改变问题
- 缓存服务器在Linux下的运用
- UI进阶--UIPikcerView实现省市联动示例
- 关于音乐中气息的练习
- 草珊瑚理解IFC(inline formatting context)
- array_sum的用法
- Win8 DirectX 开发问题总结(一)
- 微信小程序全局分享设置
- ORACLE查询通用查询被锁对象以及解锁方案
- Java对泛型的支持(二)- 高级语法
- 大一c语言书课后题答案,C语言课后习题答案
- MFC图像处理CImage类常用操作
- [转]QNX系统开发-镜像制作及烧录分析
- API文档与模拟数据接口
- 计算机教学拼音打字教案,sogo拼音输入法教案.doc
- 高质量作品集封面合集(含封面素材、字体包和作品集封面原始文档)
- firewalld防火墙配置ip地址伪装和端口转发
- Tomcat JDBC Pool使用说明
- 〖产品思维训练白宝书 - 产品思维认知篇⑦〗- 聊一聊 产品经理 的工作内容与职责划分
- 景安服务器怎么重装系统,怎么全盘重装系统|全盘重装系统步骤