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
思路:本题为最优解问题,可以考虑使用动态规划。 观察可知,每一次爆的气球可以把原来的数组分为两部分,一部分为所爆气球左侧的,一部分为右侧的,这样的左右两侧将互不干扰。这样可以得到问题的子问题,找到每一部分的最大值,由此得到动态规划:设定一个result[j][k],表示从气球j到k的最终计算结果的最大值,最后result[0][nums.size() + 1]表示最终结果。(由note 1,将原数组的左侧和右侧均增加一个数字为1的气球)。
class Solution {
public:
int maxCoins(vector<int>& nums) {
int temp[nums.size() + 2];
temp[0] = 1;
temp[nums.size() + 1] = 1;
for (int i = 0; i < nums.size(); i++) {
temp[i + 1] = nums[i];
}
int result[nums.size() + 2][nums.size() + 2];
for (int i = 0; i < nums.size() + 2; i++) {
for (int j = 0; j < nums.size() + 2; j++) {
result[i][j] = 0;
}
}
for (int i = 2; i < nums.size() + 2; i++) {
for (int j = 0; j + i < nums.size() + 2; j++) {
int k = j + i;
for (int m = j + 1; m < k; m++) {
result[j][k] = max(result[j][m] + temp[j] * temp [m] * temp[k] + result[m][k], result[j][k]);
}
}
}
return result[0][nums.size() + 1];
}
};