斜率优化 学习笔记

0x00 前言

对于形如 fi=fj+val(i,j) 的递推式,斜率优化适用于 val(i,j) 中存在同时与 i,j 相关的项的情况。

0x01 引入

例题:P3195 [HNOI2008]玩具装箱

有 n 个玩具,第 i 个玩具价值为 ci 。要求将这 n 个玩具排成一排,分成若干段。对于一段 [l,r] ,它的代价为 (rl+i=lrciL)2 ,其中 L 是一个常量,求分段的最小代价。 1n5×104,1L,ci107

定义 fi 表示对前 i 个分段的最小代价,有转移 fi=minj=0i1(fj+(i(j+1)+aiajL)2) ,初始为 f0=0 。其中 ai 表示 j=1icj 。时间复杂度 O(n2)

因为 val(i,j) 拆项后出现了同时与 i,j 相关的项,无法对 fj+val(i,j) 分组后使用单调队列优化。

0x02 优化

先化简一下式子。令 si=ai+i,LL+1,则 fi=fj+(sisjL)2,fi(siL)2=(fj+sj2)2(siL)sj

考虑一次函数的表达式 y=kx+b ,变形为 b=ykx 。把只与 i 有关的,只与 j 有关的和与 i,j 都有关的部分表示成 b,y,kx。即 bi=fi(siL)2,yi=fj+sj2,ki=2(siL),xi=sj ,最小化 b 。把 (xi,yi) 看做平面直角坐标系上的点,问题就转化成了有一条斜率为 ki 的直线,选择合适的点 (xj,yj) 穿过,最小化截距。

显然可能成为最优点的集合一定构成下凸壳(读者自证不难),所以维护候选转移只需要维护凸包。

0x03 实现

可以发现此题切点左侧直线斜率都小于 ki,右侧都大于 ki,且此题中 ki 具有单调性,故可以使用单调队列维护。时间复杂度 O(n)

ki 没有单调性,需要维护整个凸包,二分查询转移位置。时间复杂度 O(nlogn)

xi,ki 同时没有单调性,需要使用 CDQ/平衡树动态维护凸包,时间复杂度 O(nlog2n)。不过这种情况下我们一般更倾向于使用短小精悍的李超线段树。

0x04 应用

初级部分(一般的方程,直线单调)

BZOJ1597 [Usaco2008 Mar]土地购买

还是被困扰了一会。考虑先按 li 从大到小排序,再去掉 wiwj,lilji,因为他们可以和那些严格包含他们的土地分成一组而不产生任何额外的贡献。那么得到方程 fi=minj=0i1fj+wj+1li这里,我们把 wj+1 看作 xili 看作 ki 即可正常维护(如果 liki 会导致【数据删除】的问题)。

BZOJ1911 [Apio2010]特别行动队

BZOJ1010 [HNOI2008]玩具装箱

BZOJ1096 [ZJOI2007]仓库建设

BZOJ3437 小P的牧场

BZOJ3156 防御准备

BZOJ3675 [Apio2014]序列分割

BZOJ4518 [Sdoi2016]征途

HDU3507 Print Article

CF311B Cats Transport

高级部分(维护凸包需要二分/CDQ分治/平衡树)

BZOJ3672 [NOI2014]购票

BZOJ2726 [SDOI2012]任务安排

BZOJ1492 [NOI2007]货币兑换Cash

BZOJ3963 [WF2011]MachineWorks

BZOJ4700 适者

BZOJ2149 拆迁队

CF1083E The Fair Nut and Rectangles

0x05 总结

二分/CDQ/平衡树等能够优化 DP 方程的计算,于一定程度上降低复杂度,但不能改变这个方程本身。DP 方程的性质会取决于数据的特征,但 DP 方程本身取决于题目中的数学模型。

斜率优化 DP 需要灵活运用,其宗旨是将最优化问题转化为二维平面上与凸包有关的截距最值问题。遇到性质不太好的方程,有时需要辅以数据结构来加以解决,届时还请就题而论。

posted @   xx019  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示