累加器传送门:
http://blog.youkuaiyun.com/NOIAu/article/details/71775000
本篇博文意在详细讲解如下内容
F. 什么是四边形不等式
S. 四边形不等式优化如何证明
T. 怎么用四边形不等式优化
(好气啊,这篇博文我写了两遍,第一遍的没有保存就关了)
(感谢博客园的Staginner,他的博客对我有很大影响)
(感谢wys大佬亲自为我查了一部分内容的错)
(如果本文有什么错误的话,请向我提出,非常感谢)
这是他的博客:
http://www.cnblogs.com/staginner/archive/2012/03/12/2391925.html
引入:
在dp问题中,我们经常遇见这样的一类问题
他们的dp转移方程是这样的
dp[i][j]=min{dp[i][k]+dp[k+1][j]+cost[i][j]}
显然for一边i,for一边j,在算dp[i][j]的时候还得for一遍k,这是O(n^3)的复杂度,这样的复杂度在很多时候是不能接受的,如果dp转移方程已经设计好了,也无法再在dp方程上优化,我们怎么来提高计算效率呢?(关于O(n^2)复杂度的证明我放在最后)
~PART ONE 交叉小于包含
对于( a < b <= c< d )
如果有f[a][c]+f[b][d]<=f[b][c]+f[a][d]
(可以理解为一句话,交叉小于包含,即交叉的两个区间,a到c和b到d的值满足小于等于包含的两个区间[bc包含于ad])
则说这个东西满足四边形不等式,当然这个东西可能是dp数组,也可以是其他数组,比如引入里提到的cost数组,表示的是i到j的花费(比如合并石子问题)
给出两个定理:
1、如果上述的w函数同时满足区间包含单调性和四边形不等式性质,那么函数dp也满足四边形不等式性质
我们再定义s(i,j)表示 dp(i,j) 取得最优值时对应的下标(即 i≤k≤j 时,k 处的 dp 值最大,则 s(i,j)=k此时有如下定理
2、假如dp(i,j)满足四边形不等式,那么s(i,j)单调,即 s(i,j)≤s(i,j+1)≤s(i+1,j+1)
如果不知道为什么,没有关系,反正后面都要证明
~PART TWO 证明过程三步走
(这一部分如果没有完全懂没有关系,PART-THREE里会结合题目来推导一遍,所以有一小部分推导在这里先不写出来,这一部分尽量先说原理和方法)
壹:证明cost为凸(满足四边形不等式)
显然,当且仅当对于所有的i,j,均满足如下式子
(令i< i+1<= j< j+1)
cost[i][j]+cost[i+1][j+1]<=cost[i][j+1]+cost[i+1][j]
(利用PART ONE的交叉小于包含写出来的式子)
转移一下式子
即要证明对于所有的i,j,要使
cost[i][j]-cost[i+1][j]&