设有
每堆石子有一定的质量,可以用一个整数来描述,现在要将这
每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。
例如有 1 3 5 2
, 我们可以先合并 4 5 2
, 又合并 9 2
,再合并得到
如果第二步是先合并 4 7
,最后一次合并代价为
问题是:找出一种合理的方法,使总的代价最小,输出最小代价。
第一行一个数
第二行
输出一个整数,表示最小代价。
4
1 3 5 2
22
前置题目:0899
前置知识:前缀和
本题知识:动态规划-区间DP
区间DP:只将相邻的合并,具有阶段性
属性:合并的最小代价
- 枚举所有种情况:
- 第一重循环,所有区间长度
- 第二重循环,所有左端点
- 当区间长度为 1 时,只有一堆,所以合并代价为 0。
- 合并代价的计算:分为左右两堆分别的最小代价,加上合并这两堆的代价(使用前缀和提前计算)
for len := 2; len <= n; len++ {
for l := 1; l+len-1 <= n; l++ {
r := l + len - 1
f[l][r] = inf
w := s[r] - s[l-1]
for k := 0; k < r-l; k++ {
f[l][r] = oj.Min(f[l][r], f[l][l+k]+f[l+k+1][r]+w)
}
}
}