本文共 1235 字,大约阅读时间需要 4 分钟。
我们需要设计一个动态规划算法来解决这个问题。我们将通过递增地处理区间长度,并在每个区间内尝试每个潜在的戳破点,计算最大硬币数。
问题分析:
动态规划策略:
dp[l][r]
表示区间 [l, r]
的最大硬币数。状态转移:
[i, j]
,考虑将某个气球 k
戳破,计算贡献值。dp[i][j]
取区间内部最优解与贡献值的最大值。class Solution: def maxCoins(self, nums: list[int]) -> int: n = len(nums) if n == 0: return 0 nums = [1] + nums + [1] dp = [[0] * (n + 2) for _ in range(n + 2)] for l in range(1, n + 1): for i in range(1, n - l + 2): j = i + l - 1 for k in range(i, j + 1): left = nums[i - 1] current = nums[k] right = nums[j + 1] dp[i][j] = max(dp[i][j], left * current * right + dp[i][k-1] + dp[k+1][j]) return dp[1][n]
dp
:dp[l][r]
存储区间 [l, r]
的最大硬币数。通过这种方法,我们可以高效地计算出最大的硬币数,时间复杂度为O(n^3),适用于n=500的情况。
转载地址:http://qzaez.baihongyu.com/