1. 程式人生 > >LeetCode-312 Burst Balloons

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];
    }
}