博弈补充练习
Nim or not Nim
类似于 NIM 游戏,有
堆石子,不过每个回合玩家可以从某个堆中删除任意数量的对象,也可以将堆分成两个较小的石堆,拿走最后一个石子的人获胜。
还是一个裸的求 sg 函数的题,但由于范围过大,肯定不能每次来求sg函数值。
于是需要打表。
发现当
于是就做完了。
点击查看代码
[AGC017D] Game on Tree
有一棵
个节点的树,节点标号为 ,边用 表示。 Alice 和 Bob 在这棵树上玩一个游戏,Alice先手,两人轮流操作:
选择一条树上存在的边,把它断开使树变成两个连通块。然后把不包含号点的联通块删除
当一个玩家不能操作时输,你需要算出:假如两人都按最优策略操作,谁将获胜。
样例1:
如图:
首先注意每棵树默认根节点为
这个题也算是
对于一个存在分岔的节点,可以类比
类似上述思路,递归处理整个图即可。
点击查看代码
P2964 [USACO09NOV]A Coin Game S
小 A 和小 B 在玩游戏。
初始时,有个硬币被摆成了一行,从左至右第 个硬币的价值为 。
游戏的规则是,两人交替从这堆硬币的左侧连续取出若干硬币,然后将取出的硬币的价值累加至自己获得的累计价值中。若对方上次操作取出了个硬币,那么本次自己最多取出 个硬币。当没有硬币可取时,游戏结束。
游戏开始时,由小 A 先动手取硬币,最多取出个硬币。
请求出当双方都尽可能使自己的累计价值最大的情况下,小 A 能获得的累计价值最大是多少。
一道博弈
现在看来,陷入这种思维陷阱的原因就是总是站在你所要求得答案的玩家的角度进行思考,又因为两个玩家的操作是交错的,如此就造成了局限性,使你在转移的时候无法顾及另一方也满足他的最优策略。
解决方法就是不要只站在一个人的角度思考整盘游戏,应站在当前进行操作的人的位置思考整个游戏。后文还会详细解释这个思路。
同时,博弈
思考题目,感觉
- 当前最多能拿的硬币数量。
- 剩余的硬币序列的最前面一个硬币的下标是从哪里开始的。
定义状态为 表示当 以前所有硬币都拿完时,此时最多能拿多少个硬币所能获得的最大价值。
这个思维就是上文所提到的站在游戏双方的角度进行思考。如果不是这样,那么
然而现在似乎出现了个问题,假设我们从前往后进行
故这里就要采用逆向
下面思考怎么转移状态。
首先记录一个硬币序列的前缀和
因此可以直接枚举一个范围在
又引入了一个
首先
所以可知
点击查看代码
Varacious Steve
Steve 和他的一个朋友在玩游戏,游戏开始前,盒子里有
个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 个,最多抓 个。
最后一次将当盒子的甜甜圈抓完的人是这一轮游戏胜利者,他可以将所有抓到的甜甜圈吃完,另外一个人是这轮的失败者,他抓到的所有甜甜圈要重新放到盒子里。
下一轮游戏由上一轮的失败者开始抓,游戏继续。直到若干轮后,所有的甜甜圈被吃完,游戏结束。
游戏的目标是吃到尽量多的甜甜圈。游戏最开始,由Steve先抓,两个人均采用最优策略,请问Steve最多可以吃到多少甜甜圈。
也是一道博弈
分析怎样描述
- 当前回合一共有多少个甜甜圈供游戏。
- 该回合决策者已经拿了多少个甜甜圈。
- 上一回合的决策者已经拿了多少个甜甜圈。
于是构建三维 ,每一维描述从上到下的三个因子之一。(虽然代码中没这么写)同样的,这也是站在每个操作者的角度进行 。
具体细节见代码注释。
点击查看代码
Play Game
Alice 和 Bob 正在玩游戏。有两堆卡片。每堆牌有
张牌,每张牌都有一个分数。他们轮流从两堆中捡起最上面或最下面的牌,这张牌的分数将添加到他的总分中。Alice 和 Bob 都足够聪明,他们会捡起牌来获得尽可能多的分数。你知道 Alice 如果先拿起来能得到多少分数吗?
分析状态组成因子:
- 牌堆1被拿走若干张牌后当前的左端点
和右端点 - 牌堆2被拿走若干张牌后当前的左端点
和右端点
四维的状态,仍采用记忆化搜索。对每一堆牌记录一个前缀和 ,便于转移时快速查找区间和
点击查看代码
Moving Pebbles(QWQ)
给你
堆石头,两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中。谁不能拿石子了,谁就输了。请求出哪个玩家存在必胜策略。
不妨先思考一下对于先手来说的必败态。在这样的博弈问题中,一般存在一个情形,使得后手能够完全模仿先手的操作,是一个必败态。拿到这个题里面来看,假如当前石堆为
对于其他状态,先手总可以把它们转化为一个必败态,对先手来说这就是一个必胜态。
接下来考虑如何证明必败态和必胜态之间可以相互转化。
假如现在有
假如现在为一个必胜态,所有石堆按从小到大排序。
如果
如果
然后直接看初状态是必胜态还是必败态就行了。
点击查看代码
P5932 [POI1999]多边形之战
游戏在一个有
个顶点的凸多边形上进行,这个凸多边形的 条对角线将多边形分成 个三角形,这 条对角线在多边形的顶点相交。
三角形中的一个被染成黑色,其余是白色。双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。
- 注:如果连接一个多边形中任意两点的线段都完全包含于这个多边形,则称这个多边形为凸多边形。
遇到乍看来没有思路的题,画图辅助思考不失为一种不错的方法。
如图,不难发现,如果要割出一个三角形,就必须把它三个方向的三角形全部删去。那么可以知道,在这个游戏中的必胜态是黑色三角形只有一边存在三角形。这时只需切一刀就可以割下这个三角形。
假设三角形的三边所对应的三个方向分别有
又由题目知双方都会采用最优策略,所以肯定不存在黑色三角形的一边存在大量没有被割掉的三角形。理想状况是黑色三角形只有一边存在一个三角形。
所以先手是否有必胜策略就和
点击查看代码
__EOF__

本文链接:https://www.cnblogs.com/CZ-9/p/17293485.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)