【学习笔记】决策单调性优化 DP
决策单调性优化 DP
四边形不等式
最常见的判断决策单调性的方法是通过四边形不等式。即若对于任意的 \(a\le b\le c\le d\),均满足:
简化来说就是相交优于包含。则其满足四边形不等式。
一维
设 \(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)\)。

浙公网安备 33010602011771号