简介
题目链接 LeetCode 294. Flip Game II
本题的标签是Backtracking和minimax,其中minimax是一种英文的缩写,可以扩展为minimize maximum,进一步可以翻译为“极小化极大算法”。这种算法一般用于零和游戏(也就是赢家通吃,输家全输的游戏),这里minimax指的是,使最大可能损失(maximum)最小化(minimize)的过程。
想了解更多minimax的题目,可以从尼姆游戏 LeetCode 292. Nim Game开始尝试,这是一道Easy题。
和很多LeetCode上面的题一样,本题的难点在于理解题目,一起来看看。
注意:文章中一切注解皆为Python代码
理解题目
这个游戏规则如下:给一个字符串,里面全是+或者-,两个人轮流翻++,只能把++翻成--,最后没得翻的人就输了。
题目要算的是,有没有一种走法能让先手的人确保胜利guarantee a win,如果有的话返回True,没有就返回False。
题目剖析+思考过程
这题难点就难在如何理解guarantee a win这里,如果没有理解透彻可能就卡住了。
没理解透的人可能会这么想:
- 怎么才能让先手获胜呢?
- 先手走了之后,我怎么知道后手怎么走?
- 后手那么多种走法,怎么才能确保先手获胜?
但是稍微再努力想一想,就能得到如下理解:
- 题目就是在问:找出至少一种方法,使得不论后手怎么走,先手都能赢
这下,算是理解了,但是怎么实现呢?你一步,我一步的?难道要把先手/后手的信息加入到实现的函数中吗?
- 答:你可以这么做,但并不是必须的。
根据之前的理解,作为先手(1),我们要了解后手(2)所有的走法,并确保他们全都会输,这样先手(1)才可以稳赢(guarantee a win)。那此时,从后手(2)的视角看,除非先手之后(3)的走法稳赢,不然后手(2)不会必输;这样的逻辑一直接下去,就会形成一个递归的backtracking算法。如果你还没有理解,看一下下面这图:

目前,至少我们对如何找到解,有了一个大致的了解,如何去实现呢,我们可以每种先手挨个尝试?这

本文介绍了LeetCode 294题的博弈论解法,探讨了如何在翻转字符串游戏中确保先手必胜的策略。通过理解题目要求先手有稳赢策略,形成递归算法,从每个玩家想赢的角度出发,得出关键思路:先手能赢当且仅当后手无法稳赢。提供了代码实现并强调在博弈类问题中忽略先后手,关注当前玩家的最优策略。
最低0.47元/天 解锁文章
422

被折叠的 条评论
为什么被折叠?



