Problem
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
Code
public class Solution {
public int maxCoins(int[] nums) {
int len = nums.length;
if (len == 0) {
return 0;
}
int[] tmp = new int[len + 2];
tmp[0] = 1;
tmp[len + 1] = 1;
for (int i = 1; i < len + 1; ++i) {
tmp[i] = nums[i - 1];
}
int[][] dp = new int[len + 2][len + 2];
for (int i = 2; i < len + 2; ++i) {
for (int j = i; j < len + 2; ++j) {
for (int k = 1; k < i; ++k) {
//System.out.printf("%d %d %d %d\n", k, dp[j][k], dp[k][j - i], nums[j] * nums[k] * nums[j - i]);
dp[j][i] = this.max(dp[j][i], dp[j][k] + dp[j - k][i - k] + tmp[j] * tmp[j - k] * tmp[j - i]);
}
//System.out.printf("dp[%d][%d]=%d\n", j, i, dp[j][i]);
}
}
return dp[len + 1][len + 1];
}
private int max(int a, int b) {
return a > b ? a : b;
}
}