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:
- You may imagine
nums[-1] = nums[n] = 1
. They are not real therefore you can not burst them. - 0 ≤
n
≤ 500, 0 ≤nums[i]
≤ 100
Example:
Input: [3, 1, 5, 8] Output: 167
Explanation: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
Approach #1: DP.[C++]
class Solution { public: int maxCoins(vector<int>& nums) { int size = nums.size(); vector<vector<int>> temp(size+2, vector<int>(size+2, 0)); nums.insert(nums.begin(), 1); nums.push_back(1); for (int l = 1; l <= size; ++l) { for (int i = 1; i <= size-l+1; ++i) { int j = i + l -1; for (int k = i; k <= j; ++k) { temp[i][j] = max(temp[i][j], temp[i][k-1] + nums[i-1] * nums[k] * nums[j+1] + temp[k+1][j]); } } } return temp[1][size]; } };
temp[i][j] = maxCoin(nums[i:j])
ans = temp[1][n]
temp[i][j] = max(temp[i][j], temp[i][k-1] + nums[i-1]*nums[k]*nums[j+1] + temp[k+1][j]);