戳气球

区间 DP 经典难题:不要想“先戳哪个”,而要想“最后戳哪个”。

#resource / algorithm #type / snippet #status / growing #source / leetcode #algo / dp

[!info] related notes 动态规划 区间 DP 与状态机 DP

戳气球

题目链接:https://leetcode.cn/problems/burst-balloons/

关键思路

这题如果想“先戳哪个”,区间会动态变化,很难做。

正确思路是:

枚举区间里最后一个被戳破的气球是谁。

状态

补两个边界气球 1 后,定义:

dp[left][right] = 开区间 (left, right) 内所有气球都戳完能得到的最大分数

转移

枚举最后一个戳的 k

dp[left][right] = max(
    dp[left][k] + dp[k][right] + nums[left] * nums[k] * nums[right]
)

JavaScript

var maxCoins = function(nums) {
    const arr = [1, ...nums, 1];
    const n = arr.length;
    const dp = Array.from({ length: n }, () => new Array(n).fill(0));

    for (let len = 2; len < n; len++) {
        for (let left = 0; left + len < n; left++) {
            const right = left + len;
            for (let k = left + 1; k < right; k++) {
                dp[left][right] = Math.max(
                    dp[left][right],
                    dp[left][k] + dp[k][right] + arr[left] * arr[k] * arr[right]
                );
            }
        }
    }

    return dp[0][n - 1];
};
创建于 2026/3/18 更新于 2026/5/27