Loading

DP 优化

斜率优化

用于优化转移方程中含有 \(i,j\) 相关项的乘积的最优化 dp。即形如:\(f_i\gets\min\limits_{0\le j\lt i}f_j+A(i)B(j)+\dots\)

把式子改写一下:\(-A(i)B(j)+f_i+\dots=f_j+\dots\)(等号左边的省略号应只与 \(i\) 有关,右边则应只与 \(j\) 有关)。

\((B(j), f_j+\dots)\) 当作坐标系中的一个点,那么一次转移就相当于找出一个点使得经过它的斜率为 \(-A(i)\) 的直线的截距最小。

容易发现,可能成为决策点的点在一个下凸包上(若要最大化截距,则为上凸包)。假设当前 \(-A(i)=k\),那么这个下凸包上斜率小于 \(k\) 和大于 \(k\) 的分界点就是决策点,作出决策之后再将当前点加入凸包即可。

情况一:横坐标单调,查找的斜率单调

显然地,用单调队列维护凸包即可。复杂度线性。

例题

情况二:横坐标单调,查找的斜率不单调

平凡地使用单调栈维护凸包。由于凸包上的线段的斜率单调,可以每次在凸包上二分出决策点。复杂度线性对数。

例题

情况三:横坐标不单调

待补。

决策单调性

常见优化方法有两种:分治、决策队列。

分治

\(\operatorname{solve}(l,r,pl,pr)\) 表示 \([l,r]\) 的决策点在 \([pl,pr]\) 中。暴力找出 \(mid\) 的决策点 \(pm\),再递归进左右两端继续 dp,即 \(\operatorname{solve}(l,mid-1,pl,pm),\operatorname{solve}(mid+1,r,pm,pr)\)
显然,一层转移的复杂度是线性对数。

优点:实现简单易懂;对于不易直接计算的区间贡献,只要能较快地完成指针的一次移动,就能用类似于莫队的方法处理,复杂度是对的。
缺点:决策必须是在所有转移前就已处理好的,即只能从一层转移到下一层,无法同层转移(无法实现 \(f\) 转移到 \(f\))。

例题

决策队列

维护一个存放三元组 \((j,l,r)\) 的队列,表示 \(j\)\([l,r]\) 的最优决策点。

每次从队头取出当前的 \(i\) 的最优决策点 \(j\) 进行转移,并将其 \(l\) 更新为 \(i\)。接着考虑如何将 \(i\) 加入队列。

首先将队尾所有 \([l,r]\) 全都不优的决策弹出,然后在此时的队尾的 \([l,r]\) 中二分出一个点 \(p\),使得在这之前队尾的 \(j\) 更优,在这之后 \(i\) 更优。更新队尾区间为 \((j,l,p-1)\) 并将 \((i,p,n)\) 加入队列即可。

例题

常见判定方法:四边形不等式

二元函数 \(w(i,j)\) 满足四边形不等式,当且仅当 \(\forall a\le b\le c\le d, w(a,d)+w(b,c)\ge w(a,c)+w(b,d)\)
这个式子可以简记为 包含劣于相交

另一种形式:\(\forall a\le b, w(a,b+1)+w(a+1,b)\ge w(a,b)+w(a+1,b+1)\)

结论一

对于转移方程 \(f_i\gets\min\limits_{0\le j\lt i}f(j)+w(j,i)\),若 \(w\) 满足四边形不等式,则 \(f\) 具有决策单调性。

这可以将一层 \(O(n^2)\) 的转移优化到 \(O(n\log n)\)

结论二

对于一类区间 dp 方程 \(f_{l,r}\gets\min\limits_{l\le i\lt r}f_{l,i}+f_{i+1,r}+w(l,r)\),若其满足以下条件:

  • \(w\) 满足四边形不等式
  • \(f_{i,i}=w(i,i)\)
  • \(\forall a\le b\le c\le d, w(a,d)\ge w(b,c)\)

则:

  • \(f\) 也满足四边形不等式
  • \(\forall l\lt r, p_{l,r-1}\le p_{l,r}\le p_{l+1,r}\)

这可以将 \(O(n^3)\) 的区间 dp 优化到 \(O(n^2)\)

wqs 二分

posted @ 2024-09-15 19:40  Accelessar  阅读(5)  评论(0)    收藏  举报