python-leetcode-1025. 除数博弈

1025. 除数博弈 - 力扣(LeetCode)

这个问题可以使用动态规划或者博弈论的思想来解决。我们定义 dp[n] 表示当前数字为 n 时,爱丽丝是否能赢得游戏。

分析:

  1. 基本情况

    • n == 1 时,爱丽丝没有可选的 x,所以 dp[1] = False

  2. 状态转移

    • 对于 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),更为高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值