1. 程式人生 > >LeetCode 312. Burst Balloons(戳氣球)

LeetCode 312. Burst Balloons(戳氣球)

  參考:LeetCode 312. Burst Balloons(戳氣球)

  java程式碼如下

class Solution {
    //參考:https://blog.csdn.net/jmspan/article/details/51208865
    public int maxCoins(int[] nums) {
        int[] balls = new int[nums.length+2];
        balls[0] = 1;
        balls[balls.length - 1] = 1;
        int[][] coins = new int
[balls.length][balls.length]; for(int i = 0; i < nums.length; i++) { balls[i+1] = nums[i]; } for(int j = 2; j < balls.length; j++) { for(int i = j - 2; i >= 0; i--) { for(int k = j -1; k > i; k--) {
/* 這個裡面的coins[i][k] + balls[i]*balls[k]*balls[j] + coins[k][j] 是最大的可以這樣理解:以k分割(為什麼會有k,因為無論怎麼戳,最後剩三個 的時候,一定是i,j和另一個,另一個就是k,那麼要總的結果最大,那麼要k 兩邊的值都取最 大,兩邊值最大是什麼:即coins[i][k],coins[k][j],先戳兩邊的把兩個最 大找出來,最後左右兩邊剩什麼呢,正是最左邊的balls[i]和最右邊的balls[j], 最後處理k處的即balls[i]*balls[k]*balls[j]
*/ coins[i][j] = Math.max(coins[i][j], coins[i][k] + balls[i]*balls[k]*balls[j] + coins[k][j]); } } } return coins[0][balls.length - 1]; } }

  程式碼中分析了重點程式碼,採用了動態規劃,從最小的情況出發,慢慢擴大,每次都取最大(最優)的結果,最終的結果也是最優的

  三層迴圈:j:最右值,i:最左值,k:中間值,三層迴圈從小到大獲取不同長度,不同位置的陣列的一段的最值coins[i][j],coins[i][j]不包括兩端,初始時coins是int陣列預設都是0,符合實際情況,最後返回一個最長的也即最大的結果,難點就是分析到陣列的某一段剩3個元素i,j,k時的情形,可以根據這個情形反推之前要如何處理,即k前後都取最大,即這時的最大值為coins[i][k] + balls[i]*balls[k]*balls[j] + coins[k][j],個人見解,希望對你有幫助。