Leetcode 312. Burst Balloons

Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, the left and right then becomes adjacent.

Find the maximum coins you can collect by bursting the balloons wisely.

Note: 
(1) You may imagine nums[-1] = nums[n] = 1. They are not real therefore you can not burst them.
(2) 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

Example:

Given [3, 1, 5, 8]

Return 167

    nums = [3,1,5,8] --> [3,5,8] -->   [3,8]   -->  [8]  --> []
   coins =  3*1*5      +  3*5*8    +  1*3*8      + 1*8*1   = 167

解析:典型的DP问题,从dp[1][1]迭代推出dp[1][n],n表示数组最后一个数的下标,递推关系为:dp[i][j] = max(dp[i][k-1] + nums[i-1]*nums[k]*nums[j+1]+dp[k+1][j]),这里的k范围是【i,j】,这里比较难的一点是nums[i-1]*nums[k]*nums[j+1]这一项的含义,为什么是这个,如果我们burst到最后的一个气球的时候,那么最后一次可获得的分数为nums[-1]*nums[k]*nums[n],再假设两个气球的情况下(如果1是最优k值),dp[1][2] = dp[1][1] + dp[2][2] + nums[1]*nums[2]*1,由此类推,可以总结出上面的迭代公式。(此处没有给出明确的证明过程,如果有大神能够给出完整推导,还望能指点迷津)
Code:
class Solution {
public:
    int maxCoins(vector<int>& nums) {
        for(int i=0; i<nums.size(); i++){
            if(nums[i] == 0){
                nums.erase(nums.begin()+i);
                --i;
            }
        }

        const int n = nums.size();
        if(n == 0) return 0;

        nums.insert(nums.begin(),1);
        nums.insert(nums.end(),1);
        int m = nums.size();

        vector<vector<int>> dp(m,vector<int>(m,0));
        for(int k=1; k <= n; k++){
            for(int s = 1; s+k-1 <= n; s++){
                int best = 0;
                for(int b=0; b<k; b++){
                    best = max(best,dp[s][s+b-1]+nums[s-1]*nums[s+b]*nums[s+k]+dp[s+b+1][s+k-1]);
                }
                dp[s][s+k-1] = best;
            }
        }
        return dp[1][n];
    }
};
 
时间: 2024-10-21 13:20:48

Leetcode 312. Burst Balloons的相关文章

LeetCode 312. Burst Balloons(戳气球)

参考:LeetCode 312. Burst Balloons(戳气球) java代码如下 class Solution { //参考:https://blog.csdn.net/jmspan/article/details/51208865 public int maxCoins(int[] nums) { int[] balls = new int[nums.length+2]; balls[0] = 1; balls[balls.length - 1] = 1; int[][] coins

312. Burst Balloons

/* * 312. Burst Balloons * 2016-7-4 by Mingyang */ public int maxCoins(int[] iNums) { int[] nums = new int[iNums.length + 2]; int n = 1; for (int x : iNums) if (x > 0) nums[n++] = x; nums[0] = nums[n++] = 1; int[][] dp = new int[n][n]; for (int k = 2

[LeetCode][Java]Burst Balloons

Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins.

【LeetCode】312. Burst Balloons

题目: Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left a

312. Burst Balloons - LeetCode

Question https://leetcode.com/problems/burst-balloons/description/ Solution 题目大意是,有4个气球,每个气球上有个数字,现在依次打这4个气球(可以看成两边还各有一个气球即1,3,1,5,8,1),第一次打5这处气球,你的得分是左边气球上的数乘右边气球上的数再乘被打气球上的数.按任意顺序打这4个气球,求最终得分最高的值. 思考:正向思考 反向思考: public int maxCoins(int[] nums) { //

312 Burst Balloons 戳气球

现有 n 个气球按顺序排成一排,每个气球上标有一个数字,这些数字用数组 nums 表示.现在要求你戳破所有的气球.每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币. 这里的 left 和 right 代表和 i 相邻的气球的序号. 注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球.求所能获得硬币数量的最大值.注意:(1) 你可以认为 nums[-1] = nums[n] = 1,但注意它们不是真

LeetCode | 0452. Minimum Number of Arrows to Burst Balloons用最少数量的箭引爆气球【Python】

LeetCode 0452. Minimum Number of Arrows to Burst Balloons用最少数量的箭引爆气球[Medium][Python][区间贪心] Problem LeetCode There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided input is the start and end coordinates of

Leetcode: Burst Balloons

Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left and r

LeetCode OJ:Burst Balloons(击破气球)

Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left and r