312. 戳气球. dp
Posted xgbt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了312. 戳气球. dp相关的知识,希望对你有一定的参考价值。
有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组?nums?中。
现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得?nums[left] * nums[i] * nums[right]?个硬币。?这里的?left?和?right?代表和?i?相邻的两个气球的序号。注意当你戳破了气球 i 后,气球?left?和气球?right?就变成了相邻的气球。
求所能获得硬币的最大数量。
说明:
你可以假设?nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100
示例:
输入: [3,1,5,8]
输出: 167
解释: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
? coins = 315 + 358 + 138 + 181 = 167
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/burst-balloons
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def maxCoins(self, nums: List[int]) -> int:
n = len(nums)
dp = [[0] * (n + 2) for _ in range(n + 2)]
val = [1] + nums + [1]
for i in range(n - 1, -1, -1):
for j in range(i + 2, n + 2):
for k in range(i + 1, j):
sum = val[i] * val[k] * val[j]
sum += dp[i][k] + dp[k][j]
dp[i][j] = max(dp[i][j], sum)
return dp[0][n + 1]
以上是关于312. 戳气球. dp的主要内容,如果未能解决你的问题,请参考以下文章