概述
四边形不等式优化利用 决策单调性( 当 ),将 DP 复杂度从 降至 或 。核心条件是成本函数 满足四边形不等式:
分治优化(1D1D)
适用 ,且 可 或移动访问。每次计算中点决策后递归左右两边。
void solve(int l, int r, int optL, int optR) {
int mid = (l + r) / 2, optM = optL;
for (int j = optL; j <= min(mid - 1, optR); ++j)
if (w(j, mid) < w(optM, mid)) optM = j;
f[mid] = w(optM, mid);
if (l < mid) solve(l, mid - 1, optL, optM);
if (mid < r) solve(mid + 1, r, optM, optR);
}Knuth 优化(区间 DP)
适用于 ,且 满足四边形不等式与区间包含单调性。此时决策点满足 ,可将复杂度从 降至 。
问题模板
| 题目 | 题号 | 说明 |
|---|---|---|
| 邮局 | P4767 | 区间分拆 + 四边形不等式 / WQS 二分 |
| 诗人小G | P1912 | 1D1D 决策单调性 + 二分队列 |
| Lightning Conductor | POI2011 | 分治优化, |
| 守卫 | Codeforces 321E | 分治优化 |
四边形不等式定义
对于成本函数 (),若对任意 有:
则称 满足四边形不等式(quadrangle inequality)。直观理解为 交叉和 ≤ 包含和。
区间包含单调性: 若对任意 有 ,则称 满足区间包含单调性(单调递增)。
两个性质同时满足时,大多数 DP 都具备决策单调性。
决策单调性证明
考虑 ,记 为 的最优决策点。
定理: 若 满足四边形不等式,则 关于 单调不减()。
证明思路: 设 ,,,欲证 。
反证:若 ,由四边形不等式:
由 对 最优知 ,代入得 ,与 对 最优矛盾(除非相等,此时也可取 )。故 。
Knuth 优化
适用条件: 区间 DP ,且 满足四边形不等式和区间包含单调性。
关键性质: 最优决策点满足四边形单调性:
优化方法: 枚举 时只需在 内搜索。总枚举量 。
for (int len = 2; len <= n; ++len) {
for (int j = 1; j + len - 1 <= n; ++j) {
int i = j + len - 1;
f[j][i] = INF;
for (int k = opt[j][i-1]; k <= opt[j+1][i]; ++k) {
if (f[j][k] + f[k+1][i] + w(j,i) < f[j][i]) {
f[j][i] = f[j][k] + f[k+1][i] + w(j,i);
opt[j][i] = k;
}
}
}
}复杂度: 朴素 ,Knuth 优化 ,常数较小。常见于石子合并、最优二叉树等。
分治 DP 优化(Divide & Conquer DP)
适用问题: 分层 DP ,外层 层,内层 个状态, 满足四边形不等式。
核心思想: 对每层 ,计算 时利用决策单调性分治,避免枚举所有 。
void solve(int k, int l, int r, int optL, int optR) {
if (l > r) return;
int mid = (l + r) / 2, best = optL;
f[k][mid] = INF;
for (int j = optL; j <= min(mid - 1, optR); ++j) {
ll val = f[k-1][j] + w(j + 1, mid);
if (val < f[k][mid]) {
f[k][mid] = val;
best = j;
}
}
solve(k, l, mid - 1, optL, best);
solve(k, mid + 1, r, best, optR);
}
for (int k = 1; k <= K; ++k) solve(k, 1, n, 0, n - 1);复杂度: 每层递归中, 的总枚举次数为 , 层总复杂度 。
对比:
| 方法 | 复杂度 | 适用场景 |
|---|---|---|
| 朴素 | 无限制 | |
| 分治优化 | 决策单调, 难 但可移动 | |
| 二分队列 | 决策单调, 可 计算 | |
| Knuth | 区间 DP,四边形不等式 |
完整示例:P4767 邮局
题意: 个村庄在数轴上,选 个位置建邮局,求所有村庄到最近邮局距离和的最小值。
状态: 表示前 个村庄建 个邮局的最小距离和。
转移: 。
成本函数: 表示在 区间建一个邮局的最小距离和。邮局建在中位数村庄处最优。
预处理前缀和实现 查询:
int w(int l, int r) {
int m = (l + r) / 2;
int lenL = m - l, lenR = r - m;
return a[m] * lenL - (s[m-1] - s[l-1]) + (s[r] - s[m]) - a[m] * lenR;
}满足四边形不等式,可用分治优化。复杂度 ,足以通过 的数据。
决策单调性检验方法
实际竞赛中不一定要严格证明四边形不等式,可使用打表法验证:
- 运行朴素 DP 在小数据上
- 记录 的值
- 检查 是否单调不减
若通过,则大概率满足决策单调性,可直接应用分治/二分队列优化。
相关链接
多平台练习
| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |