File tree Expand file tree Collapse file tree
algorithm/src/acwing/algorithmBasicCourse/5_dynamic_programming Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments