leetcode_c++:Divide and Conquer：Burst Balloons（312）

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());

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

• zly9923218
• 2016年04月05日 00:03
• 1861

leetcode 312. Burst Balloons 分析

• Swartz2015
• 2016年01月22日 14:39
• 4993

312. Burst Balloons （Divide and Conquer）

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

LeetCode 312. Burst Balloons（戳气球）

• jmspan
• 2016年04月21日 14:39
• 1429

分治算法（divide and conquer）

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

[leetcode] 312. Burst Balloons 解题报告

• qq508618087
• 2016年05月13日 15:35
• 2100

leetcode -- Burst Balloons -- 重点dp

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

分治策略Divide and Conquer

• utimes
• 2016年08月21日 15:35
• 1569

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

• 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
• 2015年12月05日 20:15
• 496

举报原因： 您举报文章：leetcode_c++:Divide and Conquer：Burst Balloons（312） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)