

这个问题可以使用动态规划或者博弈论的思想来解决。我们定义 dp[n] 表示当前数字为 n 时,爱丽丝是否能赢得游戏。
分析:
-
基本情况:
-
当
n == 1时,爱丽丝没有可选的x,所以dp[1] = False。
-
-
状态转移:
-
对于
n > 1,爱丽丝需要选择一个x(0 < x < n 且n % x == 0),然后让n变成n - x。 -
爱丽丝想要赢得游戏,那么至少存在一个
x使得dp[n - x] = False,也就是说,能够让鲍勃进入一个必败状态。
-
代码实现:
def divisor_game(n: int) -> bool:
dp = [False] * (n + 1)
for i in range(2, n + 1):
for x in range(1, i):
if i % x == 0 and not dp[i - x]:
dp[i] = True
break
return dp[n]
# 示例测试
print(divisor_game(2)) # True
print(divisor_game(3)) # False
使用动态规划来求解这个问题。
优化:
观察 dp 的模式,我们可以发现:
-
n = 1时,爱丽丝输。 -
n = 2时,爱丽丝赢。 -
n = 3时,爱丽丝输。 -
n = 4时,爱丽丝赢。 -
发现偶数时爱丽丝赢,奇数时爱丽丝输。
因此,我们可以直接返回 n % 2 == 0 作为更高效的解法:
def divisor_game(n: int) -> bool:
return n % 2 == 0
这样时间复杂度降为 O(1),更为高效。
1003

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



