leetcode_c++:Divide and Conquer:Burst Balloons(312)

原创 2016年08月28日 15:43:54

https://leetcode.com/problems/burst-balloons/


class Solution {
public:
    int maxCoins(vector<int>& nums) {
        //remove all of zero item
        nums.erase(remove_if(nums.begin(), nums.end(), [](int n){return n==0;}), nums.end());

        //add 1 for head and tail
        nums.insert(nums.begin(),1);
        nums.push_back(1);

        int n = nums.size();
        vector< vector<int> > matrix(n, vector<int>(n,0));

        return maxCoins_DP(nums, matrix);
        return maxCoins_DC(nums, matrix, 0, n-1);
    }


    //Divide and Conquer
    //
    //  If we seprate the array to two part, left part and right part.
    //
    //  Then, we will find in this problem the left and right become adjacent 
    //  and have effects on the maxCoins in the future.
    //
    //  So, if we think reversely, if the balloon i is the last balloon of all to burst, 
    //  the left and right section now has well defined boundary and do not affect each other! 
    //  Therefore we can do either recursive method with memoization
    //
    int maxCoins_DC(vector<int>& nums, vector<vector<int>>& matrix, int low, int high) {
        if (low + 1 == high) return 0;
        if (matrix[low][high] > 0) return matrix[low][high];
        int result = 0;
        for (int i = low + 1; i < high; ++i){
            result = max(result,  nums[low] * nums[i] * nums[high] 
                                    + maxCoins_DC(nums, matrix, low, i) 
                                    + maxCoins_DC(nums, matrix, i, high));
        }
        matrix[low][high] = result;
        return result;
    }

    //Dynamic Programming
    // 
    //  using the same idea of above 
    //
    int maxCoins_DP(vector<int>& nums, vector<vector<int>>& dp) {
        int n = nums.size();
        for (int k = 2; k < n; ++k) {
            for (int low = 0; low < n - k; low++){
                int high = low + k;
                for (int i = low + 1; i < high; ++i)
                    dp[low][high] = max( dp[low][high],
                         nums[low] * nums[i] * nums[high] + dp[low][i] + dp[i][high]);
            }
        }
        return dp[0][n - 1];
    }

private:
    void printVector(vector<int>& nums) {
        cout << "nums: ";
        for (auto n: nums) {
            cout << n << ' ';
        }
        cout << '\n';
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

LeetCode 312. Burst Balloons

题目312. Burst Balloons思路考虑最后一个戳破的气球,这个气球的位置可以把整个气球数组分成两部分。 注意是最后一个,不是第一个,之前一直没转过弯来。 利用动态规划思路:动态规划数组...
  • zly9923218
  • zly9923218
  • 2016年04月05日 00:03
  • 1861

leetcode 312. Burst Balloons 分析

最近在学习动态规划,因为之前初步看了CLRS上面的动态规划部分,觉得已经有了一定的了解,于是想去leetcode上面刷一下动归部分的题目。说实话,不简单。主要还是自己对动态规划没有理解好。按accep...
  • Swartz2015
  • Swartz2015
  • 2016年01月22日 14:39
  • 4993

312. Burst Balloons (Divide and Conquer)

Total Accepted: 23535Total Submissions: 56077Difficulty: HardContributors: Admin 题目: Given n b...
  • zhanhailiu
  • zhanhailiu
  • 2017年03月28日 21:11
  • 62

LeetCode 312. Burst Balloons(戳气球)

原题网址:https://leetcode.com/problems/burst-balloons/ Given n balloons, indexed from 0 to n-1. Each ...
  • jmspan
  • jmspan
  • 2016年04月21日 14:39
  • 1429

分治算法(divide and conquer)

0) 引论 正如名字divide and conquer所言,分治算法分为两步,一步是divide,一步是conquer。 Divide:Smaller Problems are solved rec...
  • changyuanchn
  • changyuanchn
  • 2013年12月09日 12:07
  • 5098

[leetcode] 312. Burst Balloons 解题报告

题目链接:https://leetcode.com/problems/burst-balloons/ Given n balloons, indexed from 0 to n-1. Each ...
  • qq508618087
  • qq508618087
  • 2016年05月13日 15:35
  • 2100

leetcode -- Burst Balloons -- 重点dp

https://leetcode.com/problems/burst-balloons/类似于矩阵连乘的问题,但与house robber问题不一样。这里是2D dp,决策变量是在那个位置burst...
  • xyqzki
  • xyqzki
  • 2015年12月28日 12:50
  • 3668

分治策略Divide and Conquer

对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原...
  • utimes
  • utimes
  • 2016年08月21日 15:35
  • 1569

算法导论学习笔记之二--分而治之(divide-and-conquer approach)

如果一个问题当它的规模缩小的时候,问题性质不变,并且问题的规模最小的时候简单可解,就可以采用divide-and-conquer 方法。 divide-and-conquer 分以下4步进行: 直接...
  • institute
  • institute
  • 2014年03月02日 17:21
  • 2889

leetcode 312 : Burst Balloons

1、原题如下: Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it repre...
  • l3368bcttqnqn
  • l3368bcttqnqn
  • 2015年12月05日 20:15
  • 496
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode_c++:Divide and Conquer:Burst Balloons(312)
举报原因:
原因补充:

(最多只允许输入30个字)