概述

四边形不等式优化利用 决策单调性),将 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 二分
诗人小GP19121D1D 决策单调性 + 二分队列
Lightning ConductorPOI2011分治优化,
守卫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;
}

满足四边形不等式,可用分治优化。复杂度 ,足以通过 的数据。

决策单调性检验方法

实际竞赛中不一定要严格证明四边形不等式,可使用打表法验证:

  1. 运行朴素 DP 在小数据上
  2. 记录 的值
  3. 检查 是否单调不减

若通过,则大概率满足决策单调性,可直接应用分治/二分队列优化。

相关链接

多平台练习

| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |