Appearance
简介
区间 DP 以区间为研究对象。通常设
例
分析
合并第
- 合并第
堆石子,消耗体力值 ; - 合并第
堆石子,消耗体力值为 ; - 合并剩下两堆石子,消耗体力值
。
枚举
其中
状态转移顺序为 for
循环必须在最外层。
问题的解是
cpp
memset(f, 0x7f, sizeof f);
// 预处理前缀和
for (int i = 1; i <= n; i ++) {
f[i][i] = 0;
sum[i] = sum[i - 1] + a[i];
}
// 枚举区间长度
for (int len = 2; len <= n; len ++) {
// 枚举区间左端点
for (int l = 1; l + len - 1 <= n; l ++) {
// 计算区间右端点
int r = l + len - 1;
for (int k = l; k < r; k ++)
f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r]);
f[l][r] += sum[r] - sum[l - 1];
}
}