312. Burst Balloons
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.
Solution:
F[i,j] ------------------------------------- the max score you got when you had bursted from i + 1 to j - 1
So, We have
f[i][k] = max(f[i][k], f[i][j] + f[j][k] + nums[i] * nums[j] * nums[k]); where j is i + 1 to k - 1
class Solution {
public:
int maxCoins(vector<int>& nums) {
if (nums.size() == 0)
return 0;
if (nums.size() == 1)
return nums[0];
nums.insert(nums.begin(), 1);
nums.push_back(1);
int f[nums.size()][nums.size()]; memset(f, 0, sizeof(f));
for (int len = 2; len < nums.size(); ++ len)
for (int i = 0; i < nums.size() - len; ++ i) {
int k = i + len;
for (int j = i + 1; j < k; ++ j)
f[i][k] = max(f[i][k], f[i][j] + f[j][k] + nums[i] * nums[j] * nums[k]);
}
return f[0][nums.size() - 1];
}
};