LeetCode:Burst Balloons

Burst Balloons




Total Accepted: 10164  Total Submissions: 27045  Difficulty: Hard

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

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

Hide Tags
  Divide and Conquer Dynamic Programming


































思路:

D&C.参考https://leetcode.com/discuss/72216/share-some-analysis-and-explanations


c++ code:

class Solution {
public:
    int maxCoins(vector<int>& nums) {
        
        vector<int> balloons(nums.size()+2);
        int n = 1;
        for(int num : nums) balloons[n++] = num;
        balloons[0] = balloons[n++] = 1;
        
        vector<vector<int>> mark(n, vector<int>(n));
        return maxCoins(balloons, mark, 0, n-1);
    }
    
    // 自定义函数
    int maxCoins(vector<int>& nums, vector<vector<int>>& mark, int left, int right) {
        if(left + 1 == right) return 0;
        if(mark[left][right] > 0) return mark[left][right];
        
        int ans = 0;
        for(int i=left + 1;i<right;i++) {
            ans = max(ans, nums[left] * nums[i] * nums[right] 
                + maxCoins(nums, mark, left, i) + maxCoins(nums, mark, i, right));
        }
        mark[left][right] = ans;
        return ans;
    }
};


你可能感兴趣的:(LeetCode,dynamic,programming,and,divide,conquer)