Skip to content

Commit 5096f6e

Browse files
committed
feat: add solutions to lc problem: No.0312. Burst Balloons
1 parent 4a1ca96 commit 5096f6e

File tree

6 files changed

+256
-36
lines changed

6 files changed

+256
-36
lines changed

solution/0300-0399/0312.Burst Balloons/README.md

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,27 +39,120 @@ coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167</pre>
3939
<li><code>0 <= nums[i] <= 100</code></li>
4040
</ul>
4141

42-
4342
## 解法
4443

4544
<!-- 这里可写通用的实现逻辑 -->
4645

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+
4753
<!-- tabs:start -->
4854

4955
### **Python3**
5056

5157
<!-- 这里可写当前语言的特殊实现逻辑 -->
5258

5359
```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]
5571
```
5672

5773
### **Java**
5874

5975
<!-- 这里可写当前语言的特殊实现逻辑 -->
6076

6177
```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+
```
62124
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+
}
63156
```
64157

65158
### **...**

solution/0300-0399/0312.Burst Balloons/README_EN.md

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,107 @@ coins = 3*1*5 + 3*5*8 + 1*3*8 + 1*8*1 = 167</pre>
3636
<li><code>0 &lt;= nums[i] &lt;= 100</code></li>
3737
</ul>
3838

39-
4039
## Solutions
4140

4241
<!-- tabs:start -->
4342

4443
### **Python3**
4544

4645
```python
47-
46+
class Solution:
47+
def maxCoins(self, nums: List[int]) -> int:
48+
nums = [1] + nums + [1]
49+
n = len(nums)
50+
dp = [[0] * n for _ in range(n)]
51+
for l in range(2, n):
52+
for i in range(n - l):
53+
j = i + l
54+
for k in range(i + 1, j):
55+
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j])
56+
return dp[0][-1]
4857
```
4958

5059
### **Java**
5160

5261
```java
62+
class Solution {
63+
public int maxCoins(int[] nums) {
64+
int[] vals = new int[nums.length + 2];
65+
vals[0] = 1;
66+
vals[vals.length - 1] = 1;
67+
System.arraycopy(nums, 0, vals, 1, nums.length);
68+
int n = vals.length;
69+
int[][] dp = new int[n][n];
70+
for (int l = 2; l < n; ++l) {
71+
for (int i = 0; i + l < n; ++i) {
72+
int j = i + l;
73+
for (int k = i + 1; k < j; ++k) {
74+
dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k][j] + vals[i] * vals[k] * vals[j]);
75+
}
76+
}
77+
}
78+
return dp[0][n - 1];
79+
}
80+
}
81+
```
82+
83+
### **C++**
84+
85+
```cpp
86+
class Solution {
87+
public:
88+
int maxCoins(vector<int>& nums) {
89+
nums.insert(nums.begin(), 1);
90+
nums.push_back(1);
91+
int n = nums.size();
92+
vector<vector<int>> dp(n, vector<int>(n));
93+
for (int l = 2; l < n; ++l)
94+
{
95+
for (int i = 0; i + l < n; ++i)
96+
{
97+
int j = i + l;
98+
for (int k = i + 1; k < j; ++k)
99+
{
100+
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j]);
101+
}
102+
}
103+
}
104+
return dp[0][n - 1];
105+
}
106+
};
107+
```
53108
109+
### **Go**
110+
111+
```go
112+
func maxCoins(nums []int) int {
113+
vals := make([]int, len(nums)+2)
114+
for i := 0; i < len(nums); i++ {
115+
vals[i+1] = nums[i]
116+
}
117+
n := len(vals)
118+
vals[0], vals[n-1] = 1, 1
119+
dp := make([][]int, n)
120+
for i := 0; i < n; i++ {
121+
dp[i] = make([]int, n)
122+
}
123+
for l := 2; l < n; l++ {
124+
for i := 0; i+l < n; i++ {
125+
j := i + l
126+
for k := i + 1; k < j; k++ {
127+
dp[i][j] = max(dp[i][j], dp[i][k]+dp[k][j]+vals[i]*vals[k]*vals[j])
128+
}
129+
}
130+
}
131+
return dp[0][n-1]
132+
}
133+
134+
func max(a, b int) int {
135+
if a > b {
136+
return a
137+
}
138+
return b
139+
}
54140
```
55141

56142
### **...**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int maxCoins(vector<int>& nums) {
4+
nums.insert(nums.begin(), 1);
5+
nums.push_back(1);
6+
int n = nums.size();
7+
vector<vector<int>> dp(n, vector<int>(n));
8+
for (int l = 2; l < n; ++l)
9+
{
10+
for (int i = 0; i + l < n; ++i)
11+
{
12+
int j = i + l;
13+
for (int k = i + 1; k < j; ++k)
14+
{
15+
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j]);
16+
}
17+
}
18+
}
19+
return dp[0][n - 1];
20+
}
21+
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func maxCoins(nums []int) int {
2+
vals := make([]int, len(nums)+2)
3+
for i := 0; i < len(nums); i++ {
4+
vals[i+1] = nums[i]
5+
}
6+
n := len(vals)
7+
vals[0], vals[n-1] = 1, 1
8+
dp := make([][]int, n)
9+
for i := 0; i < n; i++ {
10+
dp[i] = make([]int, n)
11+
}
12+
for l := 2; l < n; l++ {
13+
for i := 0; i+l < n; i++ {
14+
j := i + l
15+
for k := i + 1; k < j; k++ {
16+
dp[i][j] = max(dp[i][j], dp[i][k]+dp[k][j]+vals[i]*vals[k]*vals[j])
17+
}
18+
}
19+
}
20+
return dp[0][n-1]
21+
}
22+
23+
func max(a, b int) int {
24+
if a > b {
25+
return a
26+
}
27+
return b
28+
}
Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,19 @@
11
class Solution {
2-
32
public int maxCoins(int[] nums) {
4-
if (nums == null || nums.length == 0) {
5-
return 0;
6-
}
7-
int n = nums.length;
8-
int[][] f = new int[n + 2][n + 2];
9-
for (int i= 0; i < n + 2; ++i) {
10-
for (int j = 0; j < n + 2; ++j) {
11-
f[i][j] = -1;
3+
int[] vals = new int[nums.length + 2];
4+
vals[0] = 1;
5+
vals[vals.length - 1] = 1;
6+
System.arraycopy(nums, 0, vals, 1, nums.length);
7+
int n = vals.length;
8+
int[][] dp = new int[n][n];
9+
for (int l = 2; l < n; ++l) {
10+
for (int i = 0; i + l < n; ++i) {
11+
int j = i + l;
12+
for (int k = i + 1; k < j; ++k) {
13+
dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k][j] + vals[i] * vals[k] * vals[j]);
14+
}
1215
}
1316
}
14-
int[] bak = new int[n + 2];
15-
bak[0] = bak[n + 1] = 1;
16-
for (int i = 1; i < n + 1; ++i) {
17-
bak[i] = nums[i - 1];
18-
}
19-
return dp(bak, f, 0, n + 1);
20-
}
21-
22-
private int dp(int[] nums, int[][] f, int x, int y) {
23-
if (f[x][y] != -1) {
24-
return f[x][y];
25-
}
26-
27-
f[x][y] = 0;
28-
29-
//枚举最后一个戳破的气球的位置
30-
for (int i = x + 1; i < y; ++i) {
31-
f[x][y] = Math.max(f[x][y], nums[i] * nums[x] * nums[y] + dp(nums,f, x, i) + dp(nums, f, i, y));
32-
}
33-
return f[x][y];
34-
17+
return dp[0][n - 1];
3518
}
36-
37-
3819
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution:
2+
def maxCoins(self, nums: List[int]) -> int:
3+
nums = [1] + nums + [1]
4+
n = len(nums)
5+
dp = [[0] * n for _ in range(n)]
6+
for l in range(2, n):
7+
for i in range(n - l):
8+
j = i + l
9+
for k in range(i + 1, j):
10+
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j])
11+
return dp[0][-1]

0 commit comments

Comments
 (0)