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的主要内容,如果未能解决你的问题,请参考以下文章

312. 戳气球

312. 戳气球困难区间DP

312. 戳气球(区间dp)

312. 戳气球(区间dp)

leetcode 312. Burst Balloons 戳气球(困难)

LeetCode 312. Burst Balloons(戳气球)