LeetCode题解(1690):石子游戏VII(Python)

博客内容介绍了如何使用动态规划解决一个名为石子游戏VII的问题。代码实现了一个Python类,通过计算前缀和并建立动态规划矩阵来确定玩家在剩余一定数量石子时的最佳策略。时间复杂度和空间复杂度均为O(N^2),并在给定的测试用例中给出了执行时间。
摘要由CSDN通过智能技术生成

题目:原题链接(中等)

标签:动态规划

解法时间复杂度空间复杂度执行用时
Ans 1 (Python) O ( N 2 ) O(N^2) O(N2) O ( N 2 ) O(N^2) O(N2)4052ms (60.65%)
Ans 2 (Python)
Ans 3 (Python)

解法一:

class Solution:
    def stoneGameVII(self, stones: List[int]) -> int:
        n = len(stones)

        # 计算前缀和数列
        prefix = [0]
        now = 0
        for s in stones:
            now += s
            prefix.append(now)

        # print("前缀和:", prefix)

        dp = [[0] * n for _ in range(n)]

        for l in range(1, n):
            for i in range(n - l):
                j = i + l

                # 当剩下2个石头时
                if l == 1:
                    dp[i][j] = max(stones[i], stones[j])

                # 当剩下3个及以上的石头时
                else:
                    # print((i, j), stones[i:j + 1], "拿走:", stones[i], "->", (prefix[j + 1] - prefix[i + 1]),
                    #       dp[i + 1][j], "=", prefix[j + 1] - prefix[i + 1] - dp[i + 1][j])
                    # print((i, j), stones[i:j + 1], "拿走:", stones[j], "->", (prefix[j] - prefix[i]), dp[i][j - 1], "=",
                    #       (prefix[j] - prefix[i]) - dp[i][j - 1])
                    dp[i][j] = max((prefix[j + 1] - prefix[i + 1]) - dp[i + 1][j],  # 拿掉i
                                   (prefix[j] - prefix[i]) - dp[i][j - 1])  # 拿掉j

        # for row in dp:
        #     print(row)

        return dp[0][-1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值