数学推导比较多。但是充斥着对称美。
单调队列/斜率优化,都是决策单调性优化。这篇主要说四边形不等式优化。
还没写完。
基本定义
四边形不等式:对于二元函数 w x , y w x , y ,如果对于定义域内任意 a ≤ b ≤ c ≤ d a ≤ b ≤ c ≤ d ,都有 w a , b + w c , d ≥ w a , c + w b , d w a , b + w c , d ≥ w a , c + w b , d (相交 ≤ ≤ 包含 ),那么称 w i , j w i , j 满足四边形不等式。 (定义①)
等价转化
对于二元函数 w x , y w x , y ,若对于任意 a < b a < b ,存在 w a , b + 1 + w a + 1 , b ≥ w a , b + w a + 1 , b + 1 w a , b + 1 + w a + 1 , b ≥ w a , b + w a + 1 , b + 1 ,那么 w i , j w i , j 也满足四边形不等式。(定义②)
定义①通常用来推出某些结论,定义②通常用来证明某个二元函数满足四边形不等式。
证明等价:
对于 c > a c > a ,如果 c = a + 1 c = a + 1 ,则有:w a , c + 1 + w a + 1 , c ≥ w a , c + w a + 1 , c + 1 w a , c + 1 + w a + 1 , c ≥ w a , c + w a + 1 , c + 1 成立,否则有:
w a , c + 1 + w a + 1 , c ≥ w a , c + w a + 1 , c + 1 w a + 1 , c + 1 + w a + 2 , c ≥ w a + 1 , c + w a + 2 , c + 1 w a , c + 1 + w a + 1 , c ≥ w a , c + w a + 1 , c + 1 w a + 1 , c + 1 + w a + 2 , c ≥ w a + 1 , c + w a + 2 , c + 1
加起来得到:
w a , c + 1 + w a + 2 , c ≥ w a , c + w a + 2 , c + 1 w a , c + 1 + w a + 2 , c ≥ w a , c + w a + 2 , c + 1
以此类推,得到对于任意 a ≤ b ≤ c a ≤ b ≤ c ,有:
w a , c + 1 + w b , c ≥ w a , c + w b , c + 1 w a , c + 1 + w b , c ≥ w a , c + w b , c + 1
故技重施。对于 c < m a x n c < m a x n ,
w a , c + 2 + w b , c + 1 ≥ w a , c + 1 + w b , c + 2 w a , c + 2 + w b , c + 1 ≥ w a , c + 1 + w b , c + 2
加起来得到:
w a , c + 2 + w b , c ≥ w a , c + w b , c + 2 w a , c + 2 + w b , c ≥ w a , c + w b , c + 2
以此类推,得到定义①。
矩阵形式
对于 N × M N × M 的矩阵 A A 满足四边形不等式:
∀ i 1 ≤ i 2 , j 1 ≤ j 2 , A i 1 , j 1 + A i 2 , j 2 ≤ A i 1 , j 2 + A i 2 , j 2 ∀ i 1 ≤ i 2 , j 1 ≤ j 2 , A i 1 , j 1 + A i 2 , j 2 ≤ A i 1 , j 2 + A i 2 , j 2
那么称 A A 是完全单调的。因为
A i , j + A i + 1 , j + 1 ≤ A i , j + 1 + A i + 1 , j ⇒ A i , j + 1 − A i , j ≥ A i + 1 , j + 1 − A i + 1 , j A i , j + A i + 1 , j + 1 ≤ A i , j + 1 + A i + 1 , j ⇒ A i , j + 1 − A i , j ≥ A i + 1 , j + 1 − A i + 1 , j
也即,A ∗ , j A ∗ , j 比 A ∗ , j + 1 A ∗ , j + 1 增长更快 ,如果第 i i 行最小值在第 j j 列取到,那么对于 ∀ i 1 > i , j 1 < j ∀ i 1 > i , j 1 < j ,有 A i 1 , j 1 ≤ A i 1 , j A i 1 , j 1 ≤ A i 1 , j 。
这就是四边形不等式的本质,相交小于等于还是大于等于包含不重要,只是推出了一个矩阵的单调形式,放弃了很多没用的矩阵。
应用类型 I
考虑如下 dp 转移式子:
f i = min 0 ≤ j < i { f j + v j , i } f i = min 0 ≤ j < i { f j + v j , i }
其中 v v 满足四边形不等式。
那么:若对于 i i ,其决策点 p p 比任意 k < p k < p 都更优,那么对于 i ′ > i i ′ > i ,其决策点 p p 比任意 k < p k < p 都更优。
证明:
f p + v p , i ≤ f k + v k , i v k , i + v p , i ′ ≤ v k , i ′ + v p , i f p + v p , i ≤ f k + v k , i v k , i + v p , i ′ ≤ v k , i ′ + v p , i
相加得到
f p + v p , i ′ ≤ f k + f k , i ′ f p + v p , i ′ ≤ f k + f k , i ′
不难得到推论,p i p i 单调增。
那么如何求出整个 DP 数组呢?可以从 O ( n 2 ) O ( n 2 ) 优化到 O ( n log n ) O ( n log n ) 。方法叫做二分栈 。
我们考虑 p p 数组,p i p i 表示考虑了目前算到的 DP 值,i i 的最优决策。
一开始,计算出 f 0 f 0 ,然后 p p 数组长这样:0000000000 0000000000
若干个数求完之后,数组可能变成了:0000111122 0000111122
假设已经求完了 0 ∼ 2 0 ∼ 2 的所有 DP 值并放进数组中了,那么显然 p 3 p 3 即为 3 3 的最优决策。以此计算 f 3 f 3 。
考虑如何添加 f 3 f 3 的贡献。找到一个位置,使得它之后所有数都应该填 3 3 ,例如 0000113333 0000113333 。这个有可二分性。但是暴力填写不行,复杂度退化为 O ( n 2 ) O ( n 2 ) 。怎么办?
考虑维护颜色段 ,类似珂朵莉树思想。用一个集合,元素为 ( l , r , k ) ( l , r , k ) ,表示一段为 k k 的区间。那么我们从右往左找到分割点所在区间,把右边的段全部删掉即可。已经算完的左边的点也删掉,避免污染。为什么不两层二分?实际上这个复杂度是最对的。因为最多只会有 n n 段加入了,总共也就最多有 n n 段被删除了。这个思想在 KMP 算法的时间复杂度证明中出现过,这里又出现了。
实现方面,用 deque。或者 list。后者,比较安全,但是不能随机访问。(这里不需要随机访问。)
应用类型 II
考虑如下 DP 转移式:
d p i , j = min 0 ≤ k < i { d p k , j − 1 + v k + 1 , i } d p i , j = min 0 ≤ k < i { d p k , j − 1 + v k + 1 , i }
其中 v v 满足四边形不等式。易证对于每个 j j ,d p i , j d p i , j 满足决策单调性。
先介绍另一种方法,然后考虑这两种方法有什么不一样。这种方法叫分治 。没错,分治博客里面有一个决策单调性的例题。现在知道了原理。(变成套路了捏)
考虑 s o l v e ( l , r , x , y ) s o l v e ( l , r , x , y ) 表示计算 d p l ∼ r , j d p l ∼ r , j 的值,决策点范围在 ( x , y ) ( x , y ) 。考虑计算出 m i d m i d 的决策点 k k ,然后 s o l v e ( l , m i d − 1 , x , k ) , s o l v e ( m i d + 1 , r , k , y ) s o l v e ( l , m i d − 1 , x , k ) , s o l v e ( m i d + 1 , r , k , y ) 。注意一下边界判断。
考虑时间复杂度。虽然带端点,但是端点计算次数是 O ( 区 间 数 ) = O ( n ) O ( 区 间 数 ) = O ( n ) 的,所以还是 O ( n l o g n ) O ( n l o g n ) 。
不同之处
第二种情况,是没有用到左边的 dp 值,直接先算出了右边的 dp 值的。而当遇到第一种情况那样,dp 值后来也是决策的时候,就不管用了。
因此用哪种方法,关键是看 dp 值在这一轮中会不会作为决策。
应用类型 III
考虑如下转移:
f i , j = min i ≤ k < j { f i , k + f k + 1 , j + w i , j } f i , j = min i ≤ k < j { f i , k + f k + 1 , j + w i , j }
若满足以下三个条件 :
w w 满足四边形不等式。
f i , i = w i , i = 0 f i , i = w i , i = 0 。
∀ a ≤ b ≤ c ≤ d , w a d ≥ w b c ∀ a ≤ b ≤ c ≤ d , w a d ≥ w b c (权值的区间包含关系)
那么 f f 也满足四边形不等式。
证明:要证明对于任意 i < j i < j ,有 f i , j + 1 + f i + 1 , j ≥ f i , j + f i + 1 , j + 1 f i , j + 1 + f i + 1 , j ≥ f i , j + f i + 1 , j + 1 。
首先证明 j = i + 1 j = i + 1 的情形。
当 j = i + 1 j = i + 1 的时候,f i , j + 1 + f i + 1 , j = f i , i + 2 + f i + 1 , i + 1 = f i , i + 2 f i , j + 1 + f i + 1 , j = f i , i + 2 + f i + 1 , i + 1 = f i , i + 2 。(第二个条件)
右边 = f i , i + 1 + f i + 1 , i + 2 = f i , i + 1 + f i + 1 , i + 2
考虑 f i , i + 2 f i , i + 2 的决策点是 i i 还是 i + 1 i + 1 。
决策点是 i i 。
那么 f i , i + 2 = f i , i + f i + 1 , i + 2 + w i , i + 2 = f i + 1 , i + 2 + w i , i + 2 f i , i + 2 = f i , i + f i + 1 , i + 2 + w i , i + 2 = f i + 1 , i + 2 + w i , i + 2 ;f i , i + 1 = w i , i + 1 ≤ w i , i + 2 f i , i + 1 = w i , i + 1 ≤ w i , i + 2 ,得证。
决策点是 i + 1 i + 1 。
同法可得证。
然后证明,如果对于 j − i < k j − i < k 成立,那么对于 j − i = k j − i = k 也成立:
先考虑推得的定义①式子,我们需要使用它。显然,由归纳假设推得的定义①形式为:
a ≤ b ≤ c ≤ d , c − a < k , f a , d + f b , c ≥ f a , c + f b , d a ≤ b ≤ c ≤ d , c − a < k , f a , d + f b , c ≥ f a , c + f b , d
做好了准备工作之后,我们考虑证明对于 j − i = k j − i = k ,f i , j + 1 + f i + 1 , j ≥ f i , j + f i + 1 , j + 1 f i , j + 1 + f i + 1 , j ≥ f i , j + f i + 1 , j + 1 。
考虑 x , y x , y 分别为 f i , j + 1 , f i + 1 , j f i , j + 1 , f i + 1 , j 的最优决策点。那么有 i ≤ x ≤ j , i < y < j i ≤ x ≤ j , i < y < j 。
考虑 x , y x , y 大小关系:
x ≤ y x ≤ y ,那么 i < x ≤ j , i < y < j i < x ≤ j , i < y < j 。
那么 y , x y , x 也是 f i , j , f i + 1 , j + 1 f i , j , f i + 1 , j + 1 的一个决策。注意任意一个决策算出来的 f f 值要小于最优决策。于是 f i , j + 1 + f i + 1 , j = f i , x + f x + 1 , j + 1 + w i , j + 1 + f i + 1 , y + f y + 1 , j + w i + 1 , j f i , j + 1 + f i + 1 , j = f i , x + f x + 1 , j + 1 + w i , j + 1 + f i + 1 , y + f y + 1 , j + w i + 1 , j , f i , j + f i + 1 , j + 1 ≤ f i , x + f x + 1 , j + w i , j + f i + 1 , y + f y + 1 , j + 1 + w i + 1 , j + 1 f i , j + f i + 1 , j + 1 ≤ f i , x + f x + 1 , j + w i , j + f i + 1 , y + f y + 1 , j + 1 + w i + 1 , j + 1 。
由于 w w 满足四边形不等式, w i , j + w i + 1 , j + 1 ≤ w i , j + 1 + w i + 1 , j w i , j + w i + 1 , j + 1 ≤ w i , j + 1 + w i + 1 , j ,那么要证明原式其实也就是证明 f x + 1 , j + f y + 1 , j + 1 ≤ f x + 1 , j + 1 + f y + 1 , j f x + 1 , j + f y + 1 , j + 1 ≤ f x + 1 , j + 1 + f y + 1 , j 。由于 x + 1 ≤ y + 1 ≤ j < j + 1 , j − ( x + 1 ) < k x + 1 ≤ y + 1 ≤ j < j + 1 , j − ( x + 1 ) < k ,这个式子是成立的。
x > y x > y ,同法可证。
因此 f f 满足四边形不等式。
推论:对于任意 i < j i < j 有,p i , j − 1 ≤ p i , j ≤ p i + 1 , j p i , j − 1 ≤ p i , j ≤ p i + 1 , j 。(决策单调性)
证明:考虑右式,设 q = p i , j q = p i , j ,那么对于任意 i < i + 1 ≤ k ≤ p i < i + 1 ≤ k ≤ p 有 f i , p + f i + 1 , k ≥ f i , k + f i + 1 , p f i , p + f i + 1 , k ≥ f i , k + f i + 1 , p 。那么要证明对于 f i + 1 , j f i + 1 , j ,k k 比 p p 要劣,也就是 f i + 1 , k + f k + 1 , j + w i + 1 , j − f i + 1 , p − f p + 1 , j − w i + 1 , j ≥ 0 f i + 1 , k + f k + 1 , j + w i + 1 , j − f i + 1 , p − f p + 1 , j − w i + 1 , j ≥ 0 。由上面的式子可得。
因此考虑一个矩阵 p p ,一个格子上的点总是在它左边的点和下面的点中间。例如如下矩阵,标绿色的是参与计算的格子,那么 1 1 号格子 ≤ ≤ 2 2 号格子 ≤ ≤ 3 3 号格子。
因此在计算一个点的时候,缩小了枚举范围。事实上,把 O ( n 3 ) O ( n 3 ) 优化到了 O ( n 2 ) O ( n 2 ) 。为什么呢?考虑格子 p i , j p i , j 的枚举长度为 p i + 1 , j − p i , j − 1 + 1 p i + 1 , j − p i , j − 1 + 1 。
那么每个格子被上面的格子 + 1 + 1 (如果有的话),被下面的格子 − 1 − 1 (如果有的话)。
容易发现,因为 p i , j ≤ n p i , j ≤ n ,总共计算次数是 O ( n 2 ) O ( n 2 ) 的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通