核心概述

Knuth 优化 DP:当区间型 DP 满足四边形不等式与决策单调性时,通过预处理与单调性剪枝,将三重循环的 O(n^3) 优化为 O(n^2)。

原文引述

Description: Optimize DP with quadrangle inequality: opt[l][i] ≤ opt[l][i+1] ≤ opt[l+1][i+1]. Precompute optimal split points to reduce O(n^3) DP to O(n^2).(摘自本节点现有英文注释) Time: Precomputation O(n^2); DP O(n^2)(摘自本节点现有英文注释) Status: tested(摘自本节点现有英文注释)

展开阐述

  • 适用条件

    • DP 形式:dp[l][r] = min_{k∈[l,r)} (dp[l][k] + dp[k+1][r] + cost(l,k,r))。
    • 四边形不等式:w[a][c] + w[b][d] ≤ w[a][d] + w[b][c](对于 l≤a≤b≤c≤d≤r)。
    • 单调性:决策点 opt[l][r] 关于 l 非减,关于 r 非减。
  • 核心流程

    1. 预处理决策点:
      • 对每个区间长度 len=2..n,计算 opt[l][r]。
      • 利用已知的 opt[l][r−1] 和 opt[l+1][r] 来缩小搜索范围。
    2. DP 计算:
      • 使用预处理的 opt[l][r] 限制 k 的范围,避免 O(n^3) 枚举。
    3. 路径回溯:
      • 从 dp[0][n-1] 依次根据 opt 记录重构解。
  • 代码框架(矩阵链乘)

for (int len = 2; len <= n; ++len) {
    for (int l = 0; l + len <= n; ++l) {
        int r = l + len;
        int opt = opt[l+1][r];
        ll best = INF;
        for (int k = opt[l][r-1]; k <= opt[l+1][r]; ++k) {
            ll cur = dp[l][k] + dp[k+1][r] + dims[l]*dims[k+1]*dims[r+1];
            if (cur < best) { best = cur; opt[l][r] = k; }
        }
        dp[l][r] = best;
    }
}
  • 复杂度与边界

    • 预处理:每个区间长度 O(n),总计 O(n^2)。
    • DP:每个区间仅搜索 O(1) 的 k 范围,总计 O(n^2)。
    • 不满足四边形不等式或单调性将导致错误优化,应先验证条件。
  • 典型适用

    • 矩阵链乘、括号匹配、最优二分搜索树、凸多边形三角剖分等满足条件的区间型 DP。
  • 正确性要点

    • 依赖“决策点单调性”与“代价四边形不等式”的共同成立。
    • 记录 opt 数组便于解的重构与校验。

关联节点