@@ -39,27 +39,120 @@ coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167</pre>
39
39
<li><code>0 <= nums[i] <= 100</code></li>
40
40
</ul >
41
41
42
-
43
42
## 解法
44
43
45
44
<!-- 这里可写通用的实现逻辑 -->
46
45
46
+ 区间 DP。
47
+
48
+ - 状态表示:` dp[i][j] ` 表示戳破区间 ` (i, j) ` 内所有气球获得的最大硬币数。
49
+ - 状态计算:枚举开区间 ` (i, j) ` 中以气球 k 作为最后戳破的气球。那么 ` dp[i][j] = max(dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j]), k ∈ [i + 1, j) ` 。
50
+
51
+ 以区间长度 l 从小到大开始处理每个状态值。
52
+
47
53
<!-- tabs:start -->
48
54
49
55
### ** Python3**
50
56
51
57
<!-- 这里可写当前语言的特殊实现逻辑 -->
52
58
53
59
``` python
54
-
60
+ class Solution :
61
+ def maxCoins (self , nums : List[int ]) -> int :
62
+ nums = [1 ] + nums + [1 ]
63
+ n = len (nums)
64
+ dp = [[0 ] * n for _ in range (n)]
65
+ for l in range (2 , n):
66
+ for i in range (n - l):
67
+ j = i + l
68
+ for k in range (i + 1 , j):
69
+ dp[i][j] = max (dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j])
70
+ return dp[0 ][- 1 ]
55
71
```
56
72
57
73
### ** Java**
58
74
59
75
<!-- 这里可写当前语言的特殊实现逻辑 -->
60
76
61
77
``` java
78
+ class Solution {
79
+ public int maxCoins (int [] nums ) {
80
+ int [] vals = new int [nums. length + 2 ];
81
+ vals[0 ] = 1 ;
82
+ vals[vals. length - 1 ] = 1 ;
83
+ System . arraycopy(nums, 0 , vals, 1 , nums. length);
84
+ int n = vals. length;
85
+ int [][] dp = new int [n][n];
86
+ for (int l = 2 ; l < n; ++ l) {
87
+ for (int i = 0 ; i + l < n; ++ i) {
88
+ int j = i + l;
89
+ for (int k = i + 1 ; k < j; ++ k) {
90
+ dp[i][j] = Math . max(dp[i][j], dp[i][k] + dp[k][j] + vals[i] * vals[k] * vals[j]);
91
+ }
92
+ }
93
+ }
94
+ return dp[0 ][n - 1 ];
95
+ }
96
+ }
97
+ ```
98
+
99
+ ### ** C++**
100
+
101
+ ``` cpp
102
+ class Solution {
103
+ public:
104
+ int maxCoins(vector<int >& nums) {
105
+ nums.insert(nums.begin(), 1);
106
+ nums.push_back(1);
107
+ int n = nums.size();
108
+ vector<vector<int >> dp(n, vector<int >(n));
109
+ for (int l = 2; l < n; ++l)
110
+ {
111
+ for (int i = 0; i + l < n; ++i)
112
+ {
113
+ int j = i + l;
114
+ for (int k = i + 1; k < j; ++k)
115
+ {
116
+ dp[ i] [ j ] = max(dp[ i] [ j ] , dp[ i] [ k ] + dp[ k] [ j ] + nums[ i] * nums[ k] * nums[ j] );
117
+ }
118
+ }
119
+ }
120
+ return dp[ 0] [ n - 1 ] ;
121
+ }
122
+ };
123
+ ```
62
124
125
+ ### **Go**
126
+
127
+ ```go
128
+ func maxCoins(nums []int) int {
129
+ vals := make([]int, len(nums)+2)
130
+ for i := 0; i < len(nums); i++ {
131
+ vals[i+1] = nums[i]
132
+ }
133
+ n := len(vals)
134
+ vals[0], vals[n-1] = 1, 1
135
+ dp := make([][]int, n)
136
+ for i := 0; i < n; i++ {
137
+ dp[i] = make([]int, n)
138
+ }
139
+ for l := 2; l < n; l++ {
140
+ for i := 0; i+l < n; i++ {
141
+ j := i + l
142
+ for k := i + 1; k < j; k++ {
143
+ dp[i][j] = max(dp[i][j], dp[i][k]+dp[k][j]+vals[i]*vals[k]*vals[j])
144
+ }
145
+ }
146
+ }
147
+ return dp[0][n-1]
148
+ }
149
+
150
+ func max(a, b int) int {
151
+ if a > b {
152
+ return a
153
+ }
154
+ return b
155
+ }
63
156
```
64
157
65
158
### ** ...**
0 commit comments