这个问题可以使用动态规划或者博弈论的思想来解决。我们定义 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),更为高效。