题解
思路
代码
class Solution:
### 0108 动态规划(5436 ms,20.3 MB)
def maxCoins(self, nums: List[int]) -> int:
# 计算在一个区间上的最大值
def interval_score(i, j):
score = 0
# k为开区间(i, j)之间最后戳的一个气球
# 因此需要遍历区间,找出能够有最大值的k
# 注意:range(i + 1, j)即表示取不了i和j!
for k in range(i + 1, j):
# 注意:这里需要使用新数组val,而不是nums!
total = val[i] * val[k] * val[j] # 当前能获得的值
total += dp[i][k] + dp[k][j] # 再加上左、右区间的值
if score < total: # 更新最大值
score = total
dp[i][j] = score
# 给原数组左、右各加上一个1,便于处理
val = [1] + nums + [1]
n = len(val) # 注意:n为 新 生成数组的元素数量!
# 根据新数组val的长度来生成二维动态规划数组
# dp[i][j]表示在开区间(i,j)能获得的最多硬币
dp = [[0] * n for _ in range(n)]
# interval表示区间的长度,至少为3,最多为原数组长度
# 由于interval_score里是开区间(i+1, j),因此这里的
# interval需要从2开始取,此时满足区间长度为3,只有
# 中间一个气球能戳,interval取n同理
for interval in range(2, n):
# 每个区间起始下标i是滑动取得
for i in range(0, n - interval):
# 计算在一个区间长度interval上的最大值
interval_score(i, i + interval)
# 最后返回新数组的开区间(0, n-1),即表示原数组的闭区间[0, n-1]
return dp[0][n - 1]