(学生课程作业,一个赞0.1分,各位日后事业有成的帅哥仙女大佬点点赞吧)
这部分会更新一些博弈论相关题目(菜鸡一枚,各位大佬轻喷)
这是之前的
算法题目刷题分享(一)-CSDN博客https://blog.csdn.net/asf2013/article/details/135572850?spm=1001.2014.3001.5501
一、博弈论
博弈论的简单题目只需要理解状态转换,通过递归穷举搜索解空间就可以完成。
如果对时间复杂度有要求,需要理解几个博弈论的经典模型:
会用尽量简单的大白话去证明(我觉得大伙都不愿意看数学)
1.1Nim定理在经典Nim上
题目:
- 游戏开始时,有几堆物品(如石子或火柴)。
- 每堆物品有不定数量的个体。
- 玩家轮流从任意一堆中拿走任意数量的物品,但至少要拿走一个,且只能从一堆中拿。
- 拿走最后一个物品的玩家输掉游戏(或在某些变体中赢得游戏)。
解法:
如果所有石子堆的异或和为0,则先手输,否则赢。
简单证明:
①:最终的赢家在赢之前那一步异或和不为0
②:如果刚开始异或和不为0,那么一定可以通过一步让异或和为0
如果上述两条那么成立,那么刚开始拿到异或和不为0的那个人一定可以每次都让对手的异或和为0,而对手不管怎么操作,异或和都会变成不为0,这样反推,一定是先手异或和不为0的赢。
第一条显然成立,第二条,只需要把数量大于等于异或和最高位的那一堆拿成异或和减去最高那一位的数量,就可以让对手异或和为0.所以第二条也成立
证明完了
1.2经典Nim的变种
题目:
你和你的朋友,两个人一起玩 变种的Nim游戏:
- 桌子上有一堆石头。
- 你们轮流进行自己的回合, 你作为先手 。
- 每一回合,轮到的人拿掉 1 - 3 块石头。
- 拿掉最后一块石头的人就是获胜者。
292. Nim 游戏 - 力扣(LeetCode)https://leetcode.cn/problems/nim-game/想必各位在看过1.1之后理解了这种思想之后再做这种题会很简单。
1.2当然也可以套用1.1的思想去做,只需要做一些小小的改编,建议大伙先自己想一下
题解:
def canWinNim(self, n: int) -> bool:
return n%4!=0
简单证明:
1.2的一定会赢的情况并不是异或和为0,而是剩下的数量小于等于3。
①:最终赢家在赢之前那一步剩余数量小于等于3-->最终的赢家在赢之前那一步剩余数量%4!=0
②:如果刚开始%4为0,那么后手的人一定可以让先手的人下一次%4==0
第一条显然成立,第二条只需要拿(4-先手拿的数量),也就是说可以永远让先手处于%4==0的状态。所以%4==0一定是后手赢。
同理,如果%4!=0,那你就可以一直让对手%4=0。
证明完了