
根据贡献函数的特殊性质,得出最优决策点的单调性,可以大幅优化 DP 的复杂度。
四边形不等式#
下面默认问题要求最小化。
设贡献函数 w(l,r) 为整数域上二元函数,若对于任意 l1≤l2≤r1≤r2 满足:
w(l1,r1)+w(l2,r2)≤w(l1,r2)+w(l2,r1)
则称 w(l,r) 满足四边形不等式,记为“交叉优于包含”。
定理:若对于任意 l≤r,满足 w(l,r)+w(l+1,r+1)≤w(l,r+1)+w(l+1,r),则 w(l,r) 满足四边形不等式。
先证明对于任意 l1≤l2≤r,有 w(l1,r)+w(l2,r+1)≤w(l1,r+1)+w(l2,r),对 i=l2−l1 归纳,i=0 时显然成立。
根据假设,有:
w(l1,r)+w(l1+i−1,r+1)≤w(l1,r+1)+w(l+i−1,r)
根据条件,有:
w(l1+i−1,r)+w(l1+i,r+1)≤w(l1+i−1,r+1)+w(l1+i,r)
两式相加就有:
w(l1,r)+w(l1+i,r+1)≤w(l1+i,r+1)+w(l1+i,r)
之后证明对于满足四边形不等式,对 j=r2−r1 归纳,j=0 时显然成立:
根据假设,有:
w(l1,r1)+w(l2,r1+j−1)≤w(l1,r1+j−1),w(l2,r1)
根据上面证明的结论,有:
w(l1,r1+j−1)+w(l2,r1+j)≤w(l1,r1+j)+w(l2,r1+j−1)
两式相加就有:
w(l1,r1)+w(l2,r1+j)≤w(l1,r1+j)+w(l2,r1)
设转移方程:
fi=iminj=1{gj+w(j,i)}
设 pi 为 fi 的最优决策点,若贡献函数 w(j,i) 满足四边形不等式,则对于任意 i1<i2,pi1≤pi2。
考虑反证法,若 pi1>pi2,则 w(pi2,i2)≤w(pi1,i2) 且 w(pi1,i1)<w(pi2,i1),移项就是 w(pi2,i2)−w(pi1,i2)≤0<w(pi2,i1)−w(pi1,i1),即 w(pi1,i1)+w(pi2,i2)<w(pi2,i1)+w(pi1,i2),与四边形不等式不符。
优化 2D/1D 区间 DP:记录决策点#
若贡献函数 w(l,r) 满足对于任意 l1≤l2≤r1≤r2 满足:
w(l2,r1)≤w(l1,r2)
则称 w(l,r) 满足区间包含单调性,这里的单调性同题目的要求。
设 2D/1D 区间 DP 转移方程:
fl,r=r−1mink=l{fl,k+fk+1,r+w(l,r)}
定理:若贡献函数 w(l,r) 满足四边形不等式和区间包含单调性,那么 fl,r 满足四边形不等式,即对于任意 l1≤l2≤r1≤r2 满足 fl1,r1+fl2,r2≤fl1,r2+fl2,r1。
对 r2−l1 归纳,讨论 fl1,r2 的最优决策点 u 的位置。
若 u≥r1 或 u<l2,则 [l2,r1] 被 [l1,u] 或 [u+1,r2] 包含,以 u≥r1 为例,有:
fl1,r2+fl2,r1=fl1,u+fu+1,r2+w(l1,r2)+fl2,r1≥fl1,r1+fl2,u+fu+1,r2+w(l1,r2)≥fl1,r1+fl2,u+fu+1,r2+w(l2,r2)≥fl1,r1+fl2,r2
u<l2 的情况同理。
若 r1<u≤l2,设 fl2,r1 的最优决策点 v,以 v≤u 为例,有:
fl1,r2+fl2,r1=fl1,u+fu+1,r2+w(l1,r2)+fl2,v+fv+1,r1+w(l2,r1)≥fl1,v+fl2,u+fu+1,r1+fv+1,r2+w(l1,r2)+w(l2,r1)≥fl1,v+fl2,u+fu+1,r1+fv+1,r2+w(l1,r1)+w(l2,r2)≥fl1,r1+fl2,r2
定理:设 pl,r 为 fl,r 的最优决策点,若 fl,r 满足四边形不等式,则 pl,r−1≤pl,r≤pl+1,r。
记 u=pl,r,v1=pl,r−1,v2=pl+1,r,考虑反证法:
若 u<v1,则 u+1<v1+1≤r−1<r,由四边形不等式知:
fu+1,r−1+fv1+1,r≤fu+1,r+fv1+1,r−1
同时有:
fl,u+fu+1,r≤fl,v1+fv1+1,r
两式相加就有:
fl,u+fu+1,r−1≤fl,v1+fv1+1,r−1
与 v1 是 fl,r−1 的最优决策点不符。
若 u>v2,则 l<l+1≤v2<u,由四边形不等式知:
fl,v2+fl+1,u≤fl,u+fl+1,v2
同时有:
fl,u+fu+1,r≤fl,v2+fv2+1,r
两式相加就有:
fl+1,u+fu+1,r≤fl+1,v2+fv2+1,r
与 v2 是 fl+1,r 的最优决策点不符。
有了上面的定理,在区间 DP 过程中,记录下每个状态的最优决策点,枚举的中间点 k 的范围就可以缩小,发现对于长度相等的区间,k 的范围是若干只在端点处相交的区间,那么每一层的复杂度是 O(n),总时间复杂度就是 O(n2)。
满足四边形不等式或区间包含单调性的函数类#
一些比较复杂的函数可以通过以下性质判断是否满足四边形不等式或区间包含单调性。
性质 1:若函数 w1(l,r) 与 w2(l,r) 均满足四边形不等式(或区间包含单调性),则对于任意 c1,c2≥0,函数 (c1w1+c2+w2)(l,r) 页满足四边形不等式(或区间包含单调性)。
性质 2:若能将 w(l,r) 表示为 f(l)−g(r),则函数 w(l,r) 满足四边形恒等式,若 f,g 均单调增加,函数 w(l,r) 还满足区间包含单调性。
性质 3:设 h(x) 是一单调增加的下凸函数,若函数 w(l,r) 满足四边形不等式和区间包含单调性,则复合函数 h(w(l,r)) 也满足四边形不等式和区间包含单调性。
性质 4:设 h(x) 是一下凸函数,若函数 w(l,r) 满足四边形恒等式和区间包含单调性,则复合函数 h(w(l,r)) 也满足四边形不等式。
证明略。
优化离线决策单调性:决策单调性分治#
在四边形不等式得到的决策单调性中,若转移方程是 g+w→f 的转移,即转移是由一个完全已知的函数或是 DP 数组的上一层得来的,将这种决策单调性视作“离线的”。
使用决策单调性分治优化 DP,分治函数 solve(l,r,L,R),表示当前的转移区间 [l,r],决策点的区间 [L,R],每次取 mid=⌊l+r2⌋,暴力遍历 [L,R],找到最优决策点 p,递归处理 solve(l,mid−1,L,p) 与 solve(mid+1,r,p,R)。每次的复杂度 O(nlogn)。
在分治过程中,存在贡献函数不是一个表达式的情况,即无法独立地快速求出每个贡献函数值。如果支持快速移动指针,类似莫队的处理,维护一个当前的区间,每次查询贡献函数时直接暴力移动过去即可。
复杂度证明可以对左右指针分别考虑,左指针在决策区间的分治树上,右指针在位置区间的分治树上,不难发现每次移动次数都是区间长度的常数倍。
优化在线决策单调性:二分队列#
与上面的转移方程相反,若转移方程是 f+w→f,那么求 fi 前就要先求出前面的所有 f,无法采用上面的分治做法。
使用二分队列,队列维护若干三元组 (l,r,p),表示 [l,r] 的最优决策点是 p,每次到 i 进行如下操作。
-
按照此时队首的 p 更新 fi,将队首的 l 修改为 i+1,若 i=r,弹出队首;
-
不断取出当前队尾的三元组,并进行如下操作:
-
若 r 处的决策 p 比 i 优,退出;
-
若 l 处的决策 i 比 p 优,则令 nowp=l,弹出队尾;
-
剩余情况中,一定在 [l,r] 中存在 x 使得 [l,x] 的最优决策点是 p,而 [x+1,r] 的最优决策点是 i,二分即可,修改队尾三元组为 (l,x,p),退出;
-
将 (nowp,n,i) 放入队尾。
这样时间复杂度 O(nlogn)。
区间 DP 优化的例题是取 min 的石子合并。
预处理 si 表示将 i 作为第一个锯木厂,[1,i] 的木头运送的花费。
状态是设 fi 表示将 i 作为第二个锯木厂的花费,枚举第一个锯木厂 j,结果分成三部分:[1,j] 的花费 sj、[j+1,i] 的花费 w(j,i) 以及 [i+1,n] 的花费,其中第三部分关于 i 是常量,且贡献函数 w(j,i) 满足四边形不等式,s 是异于 f 的函数,直接分治即可。
假设 p 可以取任意实数,最后再向上取整,设 fi=ai+p,实际上要满足:
fi=maxj≠i{aj+√|i−j|}
只考虑 j<i 或 j>i,贡献函数满足四边形不等式,直接分治即可。
转移方程是:
fi=i−1minj=0{fj+|(si−sj)+(i−j−1)−L|P}
注意到 h(x)=|x−C|P 是下凸函数,且 w(j,i)=(si+i)−(sj+j) 满足四边形恒等式和区间包含单调性,那么贡献函数 h(w(j,i)) 就满足四边形不等式,在线的转移使用二分队列。
题目中给出的 1018 的限制不能通过单纯的与某个数取 min 来满足,这样的操作有违决策单调性。
设 fk,i 表示在 i 村庄设第 k 个邮局,[1,i] 中每个村庄的最短距离之和,预处理 w(l,r) 表示只在 l,r 两个村庄设邮局,[l,r] 中每个村庄的最短距离之和。
增加第 n+1 个村庄,坐标设为极大值,这样 fm+1,n+1 就是答案(在 n+1 处设邮局一定只有自己是最近的)。
转移是:
fk,i=iminj=1{fk−1,j+w(j,i)}
考虑实际意义发现贡献函数满足四边形不等式,那么直接相邻两层分治转移即可,时间复杂度 O(nmlogn)。
贡献函数不好计算,使用上面的指针移动技巧即可,时间复杂度 O(nklogn)。
参考资料#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效