1510. 石子游戏 IV
大约 2 分钟
---
1510. 石子游戏 IV
- 标签:数学、动态规划、博弈
- 难度:困难
题目链接
题目大意
描述:Alice 和 Bob 轮流玩一个游戏。开始时有一堆 个石子。每轮玩家可以移除完全平方数个石子(如 )。无法移除的玩家输。Alice 先手。
要求:判断 Alice 是否能获胜。
说明:
- 。
示例:
- 示例 1:
输入:n = 1
输出:true
解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行任何操作。- 示例 2:
输入:n = 2
输出:false
解释:Alice 只能拿走 1 个石子,然后 Bob 拿走最后一个石子并赢得胜利(2 -> 1 -> 0)。解题思路
思路 1:DP
1. 核心思想
这是一个公平组合博弈。定义 表示 个石子时先手是否能获胜。
转移:如果存在一个平方数 ,使得 (即对手在剩余石子中必败),则 。
2. 具体步骤
第 1 步:预计算所有 的平方数。
第 2 步:(没有石子时先手输)。
第 3 步::
- 遍历平方数 :
- 如果 :,跳出。
第 4 步:返回 。
3. 举例说明
以 为例:
- (拿 )
- (只能拿 ,)
- (拿 ,)
- (拿 ,,或拿 ,)
- (拿 ,拿 ,均使对手胜)
- (拿 ,)
- (拿 ,拿 )
时 Alice 输。
思路 1:代码
class Solution:
def winnerSquareGame(self, n: int) -> bool:
dp = [False] * (n + 1)
squares = [i * i for i in range(1, int(n ** 0.5) + 1)]
for i in range(1, n + 1):
for sq in squares:
if sq > i:
break
if not dp[i - sq]:
dp[i] = True
break
return dp[n]思路 1:复杂度分析
- 时间复杂度:,每个状态遍历平方数。
- 空间复杂度:。