四边形不等式是一种动态规划的优化方法,通常利用其来证明决策单调性,以优化动态规划的时间复杂度(减少枚举决策点的时间从而降一个时间维度)。
一,四边形不等式:
前置说明:w(l,r)是区间[l,r]上的权值函数,可以理解为dp转移边上的边权,即转移一步的花费。
定义:
(1)区间包含单调性:若 l≤l′≤r′≤r 且 w(l′,r′)≤w(l,r),则称函数 w(l,r) 具备区间包含单调性。
(2)四边形不等式:若对任意的 l1≤l2≤r1≤r2 有 w(l1,r1)+w(l2,r2)≤w(l1,r2)+w(l2,r1),则称函数 w(l,r) 满足四边形不等式。
四边形不等式判定定理:
- 若对于任意 a<b 均有w(a,b)+w(a+1,b+1)≤w(a,b+1)+w(a+1,b),则函数 w(l,r) 满足四边形不等式。
证明(采用数学归纳法):
(1) 注意定义给出的条件a和a+1,b和b+1,说明:当 l1+1=l2 且 r1+1=r2 成立时,函数 w 满足四边形不等式关系。
(2) 根据 (1) 来证明,当 l1+k=l2 且 r1+1=r2 成立时,函数 w 仍满足四边形不等式关系。
对于任意 a+1<c 有 w(a,c)+w(a+1,c+1)≤w(a,c+1)+w(a+1,c) ①
同时写出 w(a+1,c)+w(a+2,c+1)≤w(a+1,c+1)+w(a+2,c) ② 这里a+2=c都没关系了,一般w(i,i)都会设置为0或者其它特殊常数。
①+②得:w(a,c)+w(a+2,c+1)≤w(a,c+1)+w(a+2,c)
从而通过两个l1+1=l2的式子构建出l1+2=l2的式子,同理对于任意的正整数k,l1+k=l2都满足四边形不等式。
(3) 我们发现在上述构造过程中, l1+kl=l2 和 r1+kr=r2 两个条件相互独立。所以通过(2)的证明,r1+k=r2也都满足四边形不等式。
最后,对于任意的 l1≤l2≤r1≤r2 都满足四边形不等式。
下面我们来探讨如何利用上面的四边形不等式来优化一些递推方程。
二,一维线性DP优化
线性递推式:dpi=minj<i {dpj+w(j,i)} 注意w函数在min里面
- 定理: 当w函数满足四边形不等式时,dp函数满足决策单调性。
一些假设:
设pi为dpi的决策点,pi−1是dpi−1的决策点。
证明(采用反证法):
pi是i的决策点,而pi−1是i-1的决策点,我们要证明的是:pi−1≤pi
我们现在假设:pi<pi−1<i−1<i。
① dppi+w(pi,i)≤dppi−1+w(pi−1,i) 因为pi是i的最小决策点。
② w(pi,i−1)+w(pi−1,i)≤w(pi,i)+w(pi−1,i−1) 这一步是根据w的四边形不等式。
①+②得:dppi+w(pi,i−1)≤dppi−1+w(pi,i−1) 这说明 pi才是i-1的决策点,与假设相矛盾。
所以证明出如果pi−1是i-1的决策点,pi是i的决策点,那么pi一定大于等于pi−1。
根据决策点的单调性,我们可以使用单调队列+二分快速得出决策点。
(1)例题:CF321E Ciel and Gondolas 使用wqs二分 + w函数四边形不等式的决策单调性 O(n∗logn∗logW),W是值域。
(2)今天刷题刷到了一道:Teamwork LUOGUP5124 本来以为可以四边形不等式优化,结果G了,一开始以为转移一步的函数是满足四边形不等式的,结果写一下发现并不满足。。。就是:max[l,r]∗(r−l+1)+max[l+1,r+1]∗(r−l+1)≥max[l,r+1]∗(r−l+2)+max[l+1,r]∗(r−l)。在{1,1e9}这个数组里面就无法成立。。。。我是sb,还想了半天是不是笔记写错了。
(3)例题:H-Knapsack_2020ICPC·小米 网络选拔赛第二场 【题解】物品按w分类,分完类按v从大到小排序(假设数组为a),再做前缀和sum。使用多重背包的方式转移dp。然后w函数就是w(j,i)=sum[i−j],显然有:w(j,i)+w(j+1,i+1)=2∗sum[i−j]≥w(j,i+1)+w(j+1,i)=sum[i−j+1]+sum[i−j]⇒a[i−j]≥a[i−j+1]。满足决策单调性。使用单调队列+二分的方式转移即可(或者使用分治)。【这道题有很多人直接先贪心再小范围01背包搞过去了,但是实际上是不对的-HACK】
(4)例题:P5929 [POI1999]地图【这道题虽然可以暴力,但是仍然可以使用wqs二分+决策单调性解决】 提交记录
但是我还是想知道:为什么W(l,r)函数满足四边形不等式。可以想一下证明。 (我是暴力check出来的)
三,二维DP优化
类型一:区间递推DP Fl,r=minl≤k<r {Fl,k+Fk+1,r}+w(l,r)
类型二:序列划分DP Fk,i=minj<i {Fk−1,j+w(j,i)} k一般代表序列划分成k段
首先直接给出2个定理:
- 定理1:如果w函数满足1.区间包含单调性、2.四边形不等式,那么F函数满足四边形不等式
- 定理2:如果F函数满足了四边形不等式,定义Pl,r为F[l][r]的决策点,那么有: Pl,r−1≤Pl,r≤Pl+1,r
类型一的证明可以在OI-WIKI[参考资料(2)]找到,而且较详细,把关注点放在第二类。(参照文章底下[参考资料(1)]的证明过程)
类型二的四边形不等式感觉不如第一类那么直观,因为有一维表示划分了多少段,而另一维是序列[1:i]。(写到这里时,我还是不能直接理解)
先证明定理一:
假设函数w满足四边形不等式以及区间包含单调性,以及P[i][j]是F[i][j]的最优决策点。
(1) 当i==j时,0+0=F[i][i]+F[i+1][i+1]≤F[i][i+1]+F[i+1][i]=F[i][i+1]+0(假设f[i][i]=0,且非法状态都是0)
(2) 当i<j时,设x=P[i][j+1],y=P[i+1][j],且分两种情况:
第一种:i−1≤x≤y≤jF[i][j]+F[i+1][j+1]≤F[i−1][x]+W(x,j)+F[i][y]+W(y,j+1)≤F[i−1][x]+W(x,j+1)+F[i][y]+W(y,j)=F[i][j+1]+F[i+1][j]
第二种:i≤y<x<jF[i][j]+F[i+1][j+1]≤F[i−1][y]+W(y,j)+F[i][x]+W(x,j+1)≤F[i−1][y]+W(y,j+1)+F[i][x]+W(x,j)=F[i][j+1]+F[i+1][j]
参考资料:
(1)四边形不等式-a1b3c7d9 强推这篇,写得超级好
(2)OI-WIKI - 有较多的证明以及应用
(3)四边形不等式 Pedesis - 有些证明的思路较巧妙
(4)四边形不等式 罗勇军
(5)四边形不等式学习笔记 - 学会打表验证
(6)赵爽的论文
(7)四边形不等式讲解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效