【学习笔记】决策单调性优化 DP

决策单调性优化 DP

四边形不等式

最常见的判断决策单调性的方法是通过四边形不等式。即若对于任意的 \(a\le b\le c\le d\),均满足:

\[cost(a,c)+cost(b,d)\le cost(a,d)+cost(b,c) \]

简化来说就是相交优于包含。则其满足四边形不等式。

一维

\(f_i\) 的转移点为 \(p_i\),若满足 \(p_i\) 单调递增,则可以用决策单调性来优化 dp。

情况1

当转移方程为 \(f_i=\min/\max_{j=1}^i \{g_{j-1}+cost(j,i)\}\)。若 \(g_i\) 为一个定值。且 \(cost\) 满足四边形不等式,可使用分治优化。

\(solve(l,r,L,R)\) 表示 \(f_{l\sim r}\) 这段区间的决策点在 \([L,R]\) 范围内,可以先求出 \(mid=\lfloor\frac{l+r}{2}\rfloor\),暴力计算出决策点为 \(pos\),在递归计算 \(solve(l,mid-1,L,pos)\)\(solve(mid+1,r,pos,R)\)

\(cost\) 可以 \(\mathcal{O}(1)\) 计算,则复杂度为 \(\mathcal{O(n\log n)}\)

Code

void solve(int l,int r,int L,int R){
    if(l>r) return ;
    int mid=(l+r)>>1;
    int pos=mod;
    f[mid]=mod;
    for(int p=L;p<=min(R,mid);p++){
        if(f[mid]>f[p-1]+cost(p,mid)){
            f[mid]=f[p-1]+cost(p,mid);
            pos=p;
        }
    }
    solve(id,l,mid-1,L,pos);
    solve(id,mid+1,r,pos,R);
}

例题

情况2

当转移方程为 \(f_i=\min/\max_{j=1}^i \{f_{j-1}+cost(j,i)\}\)。则不好使用情况1的解法,此时可以使用简化 LARSCH 算法来处理这个问题。

\(solve(l,r)\) 表示求解 \(f_{l+1\sim r}\)。设 \(mid=\lfloor\frac{l+r}{2}\rfloor\),可以写求出 \(f_{l+1,mid}\) 的答案,在求出 \(f_{mid+1,r}\) 的答案。复杂度 \(\mathcal{O}(n \log n)\)。具体可以见代码。

int opt[N],f[N];//opt 表示转移点
void chk(int j,int i){//用 j 更新 i
	if(f[j]+cost(j,i)<f[i]){
		f[i]=f[j]+cost(j,i);
        opt[i]=j;
    }
}
void solve(int l,int r){
	if(r==l+1) return ;
    int mid=(l+r)>>1;
    for(int i=opt[l];i<=opt[r];i++) chk(i,mid);
    solve(l,mid);
    for(int i=l+1;i<=mid;i++) chk(i,r);
    solve(mid,r);
}
int main(){
    //..........(代码+初始化)
    chk(0,n);
    solve(0,n);
    return 0;
}

简化 LARSCH 算法的优势:可以处理需要移动访问 \(cost(i,j)\) 的题目。复杂度仍是 \(\mathcal{O}(n \log n)\)

具体见:

二维

设转移点为 \(p_{i,j}\)。有 \(p_{i,j-1}\le p_{i,j}\le p_{i+1,j}\)。复杂度 \(\mathcal{O}(n^2)\)

posted @ 2026-01-14 19:50  tyh_27  阅读(0)  评论(0)    收藏  举报