原题网址:https://leetcode.com/problems/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
方法:动态规划,定义二维数组coins,coins[a][b]表示把第a个和第b个气球之间(不含a和b)的气球戳烂,最大能得到的分值。
public class Solution {
public int maxCoins(int[] nums) {
int[] dpnums = new int[nums.length+2];
dpnums[0] = 1;
dpnums[dpnums.length-1] = 1;
for(int i=0, j=1; i<nums.length; i++, j++) dpnums[j] = nums[i];
int[][] coins = new int[dpnums.length][dpnums.length];
for(int i=2; i<dpnums.length; i++) {
for(int j=0; j+i<dpnums.length; j++) {
for(int k=j+1; k<j+i; k++) {
coins[j][j+i] = Math.max(coins[j][j+i], coins[j][k] + coins[k][j+i] +
dpnums[j] * dpnums[k] * dpnums[j+i]);
}
}
}
return coins[0][dpnums.length-1];
}
}
另一种实现方式:
public class Solution {
public int maxCoins(int[] nums) {
int[] dpnums = new int[nums.length+2];
dpnums[0] = 1;
dpnums[dpnums.length-1] = 1;
System.arraycopy(nums, 0, dpnums, 1, nums.length);
int[][] coins = new int[dpnums.length][dpnums.length];
for(int i=2; i<dpnums.length; i++) {
for(int j=i-2; j>=0; j--) {
for(int k=i-1; k>j; k--) {
coins[j][i] = Math.max(coins[j][i], coins[j][k] + dpnums[j] * dpnums[k] * dpnums[i] + coins[k][i]);
}
}
}
return coins[0][dpnums.length-1];
}
}