Patterns/Part VIII - Cross-Topic Deep Dives/Divide & Conquer DP

Pattern Reference

Divide & Conquer DP

"DP optimization: monotone opt property (quadrangle inequality). DP[i][j] = min over k < j of DP[i-1][k] + C[k][j]."

Loading...

Deep Dive Tutorial

DC DP optimization applies when dp[i][j] = min over k of (dp[i-1][k] + cost(k,j)), AND the optimal k for state j (call it opt(j)) satisfies opt(j) ≤ opt(j+1). Instead of trying all n values of k for each j (O(n²)), we solve the middle j first, then recurse on left half with k ≤ opt(mid) and right half with k ≥ opt(mid). Total O(n log n) per DP layer.

Divide and Conquer DP optimization template
// dp[j] = min over k in [lo, hi] of { prev[k] + cost(k, j) }
// Requires: optimal k for j <= optimal k for j+1 (monotone opt)
function dcDP(prevDP, n, cost) {
    const dp = new Array(n).fill(Infinity);

    function solve(lo, hi, optLo, optHi) {
        if (lo > hi) return;
        const mid = (lo + hi) >> 1;
        let bestK = optLo, bestVal = Infinity;
        // Find optimal k for mid in [optLo, min(optHi, mid)]
        for (let k = optLo; k <= Math.min(optHi, mid); k++) {
            const val = prevDP[k] + cost(k, mid);
            if (val < bestVal) { bestVal = val; bestK = k; }
        }
        dp[mid] = bestVal;
        // Left half: optimal k in [optLo, bestK]
        solve(lo, mid - 1, optLo, bestK);
        // Right half: optimal k in [bestK, optHi]
        solve(mid + 1, hi, bestK, optHi);
    }

    solve(0, n - 1, 0, n - 1);
    return dp;
}

// Knuth-Yao speedup for interval DP:
// dp[i][j] = min(dp[i][k] + dp[k][j] + w(i,j)) for i < k < j
// Requires: opt[i][j-1] <= opt[i][j] <= opt[i+1][j] (quadrangle inequality)
// Reduces O(n³) interval DP to O(n²)

Worked Problems

scissors
DC DP optimization conditions:
- dp[j] = min over k of (prev[k] + cost(k, j))
- opt(j) ≤ opt(j+1) where opt(j) = argmin k for state j
- This holds when cost function satisfies the "monotone minima" property

Knuth-Yao conditions: For interval DP dp[i][j] = min(dp[i][k]+dp[k][j]+w[i][j]):
- w satisfies quadrangle inequality: w[a][c]+w[b][d] ≤ w[a][d]+w[b][c] for a≤b≤c≤d
- Then opt[i][j-1] ≤ opt[i][j] ≤ opt[i+1][j]
- Reduces O(n³) to O(n²)

Common applicable problems: k-partition min cost, matrix chain multiplication (Knuth), optimal BST (Knuth), polygon triangulation.