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



































思路:

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;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值