292. Nim 游戏
你和你的朋友,两个人一起玩 Nim 游戏:
- 桌子上有一堆石头。
- 你们轮流进行自己的回合,你作为先手。
- 每一回合,轮到的人拿掉 1 - 3 块石头。
- 拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为
n
的情况下赢得游戏。如果可以赢,返回 true
;否则,返回 false
。示例 1:
输入:n = 4输出:false 解释:如果堆中有 4 块石头,那么你永远不会赢得比赛; 因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。
示例 2:
输入:n = 1 输出:true
示例 3:
输入:n = 2 输出:true
提示:
1 <= n <= 2
31
- 1
通过次数120,480提交次数170,281
法1 动态规划
思路
dp[i] 表示 在给定石头数量为
i
的情况下能否赢得游戏dp[i] = True if dp[i-1] dp[i-2] dp[i-3] 有一个为False
怎么理解呢?
dp[i]
为当前玩家能否赢得游戏,具体能否赢得游戏,又取决于对手会否输,只要队友会输,那当前玩家必定就能赢。所以 dp[i-1], dp[i-2] dp[i-3]
其实是看在当前玩家做不同的选择时,对手会不会输掉。题解
class Solution: def canWinNim(self, n: int) -> bool: dp = [True for _ in range(n+1)] for i in range(4, len(dp)): dp[i] = True if (not dp[i-1]) or (not dp[i-2]) or (not dp[i-3]) else False return dp[-1]
法 2 数学
思路
4 的倍数先手一定会输!
所以不是4的倍数,先手一定能赢!
题解
class Solution: def canWinNim(self, n: int) -> bool: return n% 4 != 0