LeetCode-312 Burst Balloons
轉自https://blog.csdn.net/jmspan/article/details/51208865
原題網址: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];
}
}