Skip to content

Commit d14c6c5

Browse files
committed
acwing: add 282_stone_merge.go
1 parent 067eb2a commit d14c6c5

1 file changed

Lines changed: 53 additions & 0 deletions

File tree

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
/*
4+
@Author: CodeWater
5+
@Since: 2025/03/10
6+
@desc: 282. 石子合并
7+
*/
8+
9+
import (
10+
"fmt"
11+
)
12+
13+
const N = 310
14+
15+
var (
16+
n int
17+
s [N]int
18+
//f[i][j]从第i堆到第j堆石子需要合并的最小代价
19+
f [N][N]int
20+
)
21+
22+
func min(a, b int) int {
23+
if a < b {
24+
return a
25+
}
26+
return b
27+
}
28+
29+
func main() {
30+
fmt.Scan(&n)
31+
for i := 1; i <= n; i++ {
32+
fmt.Scan(&s[i])
33+
}
34+
35+
// 求前缀和
36+
for i := 1; i <= n; i++ {
37+
s[i] = s[i-1] + s[i]
38+
}
39+
//按照长度从小到大来枚举 , 边界情况区间长度为1的时候不需要代价,f为全局默认0,所以从2开始
40+
for length := 2; length <= n; length++ {
41+
// 枚举起点1, 终点要小于等于n
42+
for i := 1; i+length-1 <= n; i++ {
43+
l, r := i, i+length-1
44+
// l - r的初始值要赋一个无穷大,不然下面计算永远是0
45+
f[l][r] = int(1e8)
46+
// 开始划分从l - r这之间的k分界线
47+
for k := l; k < r; k++ {
48+
f[l][r] = min(f[l][r], f[l][k]+f[k+1][r]+s[r]-s[l-1])
49+
}
50+
}
51+
}
52+
fmt.Println(f[1][n])
53+
}

0 commit comments

Comments
 (0)