5
5
* 难度:Hard
6
6
* 分类:Divide and Conquer, Dynamic Programming
7
7
* 思路:假设第n个气球是最后一个被踩爆,则从第n个气球开始,数组可以分为无前后相关性的两块
8
- * Tips:太难了,弃疗了,不会写。直接粘答案。
8
+ * 首尾补1,最小区间为3个数,maxCoins[1,4],则需遍历2,3两种情况, 1,4指的是边界
9
+ * maxCoins[0][n - 1] = maxCoins[0][i - 1] + maxCoins[i + 1][n - 1] + nums[left] * nums[i] * nums[right]
10
+ * left是左边界,right是右边界,不一定是相邻的
11
+ * Tips:太难了,弃疗了,不会写。直接粘答案。区间dp。
9
12
*/
10
13
public class lc312 {
11
14
public static void main (String [] args ) {
12
- System .out .println (maxCoins (new int []{3 ,1 ,5 ,8 }));
15
+ System .out .println (maxCoins2 (new int []{3 ,1 ,5 ,8 }));
13
16
}
14
17
public static int maxCoins (int [] iNums ) {
15
18
int [] nums = new int [iNums .length + 2 ];
16
19
int n = 1 ;
17
20
for (int x : iNums ) if (x > 0 ) nums [n ++] = x ;
18
21
nums [0 ] = nums [n ++] = 1 ;
19
-
20
-
21
22
int [][] memo = new int [n ][n ];
22
23
int res = burst (memo , nums , 0 , n - 1 );
23
24
return res ;
@@ -34,4 +35,23 @@ public static int burst(int[][] memo, int[] nums, int left, int right) {
34
35
return ans ;
35
36
}
36
37
38
+ public static int maxCoins2 (int [] iNums ) {
39
+ int [] nums = new int [iNums .length + 2 ];
40
+ int n = 1 ;
41
+ for (int x : iNums ) if (x > 0 ) nums [n ++] = x ;
42
+ nums [0 ] = nums [n ++] = 1 ;
43
+
44
+
45
+ int [][] dp = new int [n ][n ];
46
+ for (int k = 2 ; k < n ; ++k )
47
+ for (int left = 0 ; left < n - k ; ++left ) {
48
+ int right = left + k ;
49
+ for (int i = left + 1 ; i < right ; ++i )
50
+ dp [left ][right ] = Math .max (dp [left ][right ],
51
+ nums [left ] * nums [i ] * nums [right ] + dp [left ][i ] + dp [i ][right ]);
52
+ }
53
+
54
+ return dp [0 ][n - 1 ];
55
+ }
56
+
37
57
}
0 commit comments