区间dp之四边形不等式优化详解及证明
看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了。
在平时的做题中,我们会遇到这样的区间dp问题
它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1][j]+cost[i][j]);(或者是max(........),本博客以min为例来证明)
熟悉一般区间dp的同学应该清楚我们如果想得到最终的答案,一般要用三层for循环来计算(第一层为长度,第二层枚举起始点,第三层在起始点i和终点j之间寻找最优的分割点)。显而易见它的时间复杂度为o(n^3),但是当cost满足四边形不等式的要求时我们就可以将他优化为o(n^2)。
为什么可以这样呢,请慢慢往下看
首先什么是满足四边形不等式呢
满足四边形不等式用通俗话来讲就是对于一个区间值关系,如果它满足交叉小于包含的话,那么就说它是满足四边形不等式的。
例如当i < i' <= j < j'时,对于cost的值来说,如果它满足 cost[i][j]+cost[i'][j']<=cost[i][j']+cost[i'][j] 的关系时,那么我们就说它满足四边形不等式。
我们如果想证明一个区间值关系是否满足四边形不等式,光依靠上面的式子来判断还是有点困难的,我们不妨把上面的式子变动一下
我们以 i+1 来替换 i‘ ,以 j+1 来替换 j’ (即 i < i+1<= j < j+1 ),得到下面的式子
即当我们证明了 cost[i][j]+cost[i+1][j+1]<=cost[i][j+1]+cost[i+1][j] 时 ,我们就证明了它满足四边形不等式
我们把它移一下项
变成 cost[i][j]-cost[i+1][j]<=cost[i][j+1]-cost[i+1][j+1]
也就是证明函数F( j )=cost[i][j]-cost[i+1][j] 递增(即F( j )<=F( j+1 ))
当我们的花费数组cost[i][j]满足四边形不等式时,我们怎么将dp的时间复杂度优化为o(n^2)呢?
不幸的是,我们还要证明dp[i][j]满足四边形不等式才行,但是dp数组是我们要求的,它不是已知的,我们怎么知道它满不满足呢。
还记得我们刚刚证明了cost满足四边形不等式了吗,我们可以利用cost来推出dp满足四边形不等式
即证当 i< i+1<=j< j+1 时
dp[i][j]+dp[i+1][j+1]<=dp[i+1][j]+dp[i][j+1]
这个证明有点抽象,我先以一道题目为例使它更加容易理解
样例
7
13 7 8 16 21 4 18
输出
239
我们利用数学归纳法来证明dp数组满足四边形不等式(学过高等数学的同学应该不陌生)(如果你不知道什么是数学归纳法的话请点这里)
我们要证明dp[i][j] + dp[i+1][j+1] <= dp[i][j+1]+dp[i+1][j]成立(i < i+1 <= j < j+1)
1.当 i=1,j=2时(此时i+1=j)
因为
dp[1][1]=dp[2][2]=dp[3][3]=0,
dp[1][2]=w[1][2],dp[2][3]=w[2][3],
dp[1][3]>=w[1][3]
而由四边形不等式可知
w[1][2]+w[2][3]<=w[1][3]+w[2][2]
显然dp[1][2]+dp[2][3]<=dp[1][3]+dp[2][2]成立
2.我们令dp[i][j+1]取得最优值的时候k=x
令dp[i+1][j]取得最优值的时候k=y
当x < =y时(之后还要令x > y的情况类似)
我们假设dp[x+1][j] + dp[y+1][j+1] <= dp[x+1][j+1] + dp[y+1][j] 成立 (此时x+1 <= y+1 <= j < j+1)
这一步是数学归纳法中重要的一部分,先假设小范围的成立,然后推出大范围的成立
对于(i < i+1<=j<j+1)
显然
dp[i][j] <= dp[i][x] + dp[x+1][j] + cost[i][j]
dp[i+1][j+1] <= dp[i+1][y] + dp[y+1][j+1] + cost[i+1][j+1]
dp[i][j] + dp[i+1][j+1]<=dp[i][x] + dp[x+1][j] + cost[i][j] + dp[i+1][y] + dp[y+1][j+1] + cost[i+1][j+1]
又因为cost满足四边形不等式
cost[i][j] + cost[i+1][j+1] <= cost[i][j+1] + cost[i+1][j]
所以dp[i][x] + dp[x+1][j] + cost[i][j] + dp[i+1][y] + dp[y+1][j+1] + cost[i+1][j+1]
<= dp[i][x] + dp[x+1][j] + cost[i][j+1] + dp[i+1][y] + dp[y+1][j+1] + cost[i+1][j]
又因为dp[x+1][j] + dp[y+1][j+1] <= dp[x+1][j+1] + dp[y+1][j] 成立
所以dp[i][x] + dp[x+1][j] + cost[i][j+1] + dp[i+1][y] + dp[y+1][j+1] + cost[i+1][j]
<= dp[i][x] + dp[x+1][j+1] + cost[i][j+1] + dp[i+1][y] + dp[y+1][j] + cost[i+1][j]
=dp[i][j+1]+dp[i+1][j]
即dp[i][j] + dp[i+1][j+1] <= dp[i][j+1]+dp[i+1][j] 成立
(x+1 <= y+1 <= j < j+1)是包含在(i < i+1 <= j < j+1)里的
综上,由数学归纳法得证dp也满足四边形不等式
不理解的同学可以这样想想,显然dp[1][1],dp[2][2].....dp[n-1][n-1],dp[n][n]的值在本题中显然为0,它是满足四边形不等式的(此时dp长度为1)
而dp[1][2],dp[2][3].....dp[n-2][n-1],dp[n-1][n]的值显然为cost[1][2],cost[2][3].....cost[n-2][n-1],cost[n-1][n], 它是满足四边形不等式的(由dp[1][2]+dp[2][3]<=dp[1][3]+dp[2][2]成立可以类比推出来)
(此时dp的长度为n-(n-1)+1=2,即长度为2,枚举每个起点,知道长度,得到他们的dp值)
对于dp长度为3的值,它一定是长度小于它的dp值推出来的,所以,当长度小于它的dp值满足四边形不等式时,我们可以推出当前长度为3的dp值也满足四边形不等式
一直只要依次推下去,就可以得到dp是满足四边形不等式的
现在我们推出了dp是满足四边形不等式的
我们现在就可以尝试去降低算法的时间复杂度了
那它是怎么降低的呢?
我们只要证明最后一样关系式就可以了
即s[i][j-1]<=s[i][j]<=s[i+1][j](s[i][j]表示dp[i][j]的最优分割点(dp[i][j]=min(t|dp[i][t]+dp[t+1][j]+cost[i][j])))
我们令d=s[i][j-1] , k <= d
cut=x 表示以x为分割点的dp值(即dp[i][j]=dp[i][x]+dp[x+1][j]+cost[i][j])
构造一个式子
(dp[i][j] - dp[i][j]) - (dp[i][j-1] - dp[i][j-1])
cut=k cut=d cut=k cut=d
=(dp[i][j] + dp[i][j-1]) - (dp[i][j-1] + dp[i][j])
cut=k cut=d cut=k cut=d
=(dp[i][k]+dp[k+1][j]+cost[i][j]+dp[i][d]+dp[d+1][j-1]+cost[i][j-1])-(dp[i][k]+dp[k+1][j-1]+cost[i][j-1]+dp[i][d]+dp[d+1][j]+cost[i][j] )
=(dp[k+1][j]+dp[d+1][j-1])-(dp[k+1][j-1]+dp[d+1][j])
因为 k+1<=d+1 <=j-1< j,由四边形不等式可知
=dp[k+1][j]+dp[d+1][j-1] >= dp[k+1][j-1]+dp[d+1][j]
所以
(dp[i][j] - dp[i][j]) - (dp[i][j-1] - dp[i][j-1]) >= 0
cut=k cut=d cut=k cut=d
移一下项
(dp[i][j] - dp[i][j]) >= (dp[i][j-1] - dp[i][j-1])
cut=k cut=d cut=k cut=d
又因为d是dp[i][j-1]的最优分割点
所以
(dp[i][j-1] - dp[i][j-1]) >=0 (因为cut=d时dp[i][j-1]取最小值,cut取其他位置时得到的值必然大于在d点切割取的值)
cut=k cut=d
所以
(dp[i][j] - dp[i][j]) >=0
cut=k cut=d
又因为k是任意小于d的数(k<=d)
dp[i][j] >= dp[i][j]
cut=k cut=d
所以要想dp[i][j]最小,那么它的最优分割点s[i][j]必然大于等于d (d=s[i][j-1])
即 s[i][j] >= s[i][j-1]
证毕,同理可得
s[i][j] <= s[i+1][j]
有了s[i][j-1]<=s[i][j]<=s[i+1][j]这个结论
我们就可以把第三层for循环找最优分割点的区间从(i,j) 缩小到(s[i][j-1],s[i+1][j])
这样就把第三层for循环的时间复杂度从o(n)降到o(1)
从而把整个时间复杂度从o(n^3)降到o(n^2)。
本人因为知识有限,本博客的证明可能存在不正确的地方,欢迎大家加我的QQ给予指教。
qq:2465806616
参考博客:
https://blog.csdn.net/qq_41695941/article/details/83025188
https://blog.csdn.net/noiau/article/details/72514812
区间dp之四边形不等式优化详解及证明的更多相关文章
- 区间DP的四边形不等式优化
今天上课讲DP,所以我学习了四边形不等式优化(逃 首先我先写出满足四边形不等式优化的方程:
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- HDU 2829 Lawrence (斜率优化DP或四边形不等式优化DP)
题意:给定 n 个数,要你将其分成m + 1组,要求每组数必须是连续的而且要求得到的价值最小.一组数的价值定义为该组内任意两个数乘积之和,如果某组中仅有一个数,那么该组数的价值为0. 析:DP状态方程 ...
- 『一维线性dp的四边形不等式优化』
四边形不等式 定义:设\(w(x,y)\)是定义在整数集合上的的二元函数,若对于定义域上的任意整数\(a,b,c,d\),在满足\(a\leq b\leq c \leq d\)时,都有\(w(a,d) ...
- CSP 201612-4 压缩编码 【区间DP+四边形不等式优化】
问题描述 试题编号: 201612-4 试题名称: 压缩编码 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一段文字,已知单词a1, a2, …, an出现的频率分别t1 ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- 区间DP石子合并问题 & 四边形不等式优化
入门区间DP,第一个问题就是线性的规模小的石子合并问题 dp数组的含义是第i堆到第j堆进行合并的最优值 就是说dp[i][j]可以由dp[i][k]和dp[k+1][j]转移过来 状态转移方程 dp[ ...
- 区间dp+四边形不等式优化
区间dp+四边形优化 luogu:p2858 题意 给出一列数 \(v_i\),每天只能取两端的数,第 j 天取数价值为\(v_i \times j\),最大价值?? 转移方程 dp[i][j] :n ...
- 二叉搜索树 [四边形不等式优化区间dp]
二叉搜索树 [四边形不等式优化区间dp] 题目描述 有 \(n\) 个结点,第 \(i\) 个结点的权值为 \(i\) . 你需要对它们进行一些操作并维护一些信息,因此,你需要对它们建立一棵二叉搜索树 ...
随机推荐
- 北京AI外包团队 祝大家2019事业有事,大吉大利!
未来已来,以人工智能为核心的科技力量,在重新塑造着我们生活的环境.这种重新塑造的现象如此之明显,力量如此强大,以至于越来越多的人在讨论,我们面临着新一轮的工业革命.而且现在我们面临的这次新的科技力量, ...
- 了解UI Automator Viewer
uiautomatorviewer 是Android SDK自带的工具,通过截屏分析XML布局文件的方式,为用户提供控件信息查看服务.该工具位于SDK目录下的tools\bin子目录下,可以看到它是通 ...
- 性能测试系列-java gc调优
性能测试中除了需要做好性能测试外,我们还需要做性能测试后的,性能调优,需要发现性能问题,也需要做性能调优,在做性能调优中,jvm的性能调优是经常遇到的一个. 随着jdk版本的迅速变化,jdk里面的GC ...
- 剑指offer-01
好久没看java, 今天把 runoob 上的java基础简单过了一遍. 来吧,怎么整这个题目呢? 首先遇到的问题是java如何输入一个数组,而且这个数组并不知道长度是多少 用Scanner类 Sca ...
- JSP+MySQL最简单的登录和注册的实现 --Java Web温习
一.开发环境 开发工具:eclipse 2018-09 操作系统:win10 二.实现 1.目录结构: 2.数据库(创建tmp数据库,新建user表,user表结构如下) 3.功能简介 功能比较简单, ...
- mysql5.7 timestamp错误:there can be only oneTIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE
#1293 - Incorrect table definition; there can be only oneTIMESTAMP column with CURRENT_TIMESTAMP in ...
- 微信小程序onlaunch异步,首页onLoad先执行?
按照原理是小程序初始化时会先触发APP里的onLaunch事件,之后再执行页面Page里的onLoad事件.但实际请求时在onLaunch事件中请求获取数据,等待返回值的时候Page里的onLoad事 ...
- 在Windows Server 2012下安装 php memcache模块
一.环境描述 操作系统:Windows Server 2012 R2 Datacenter Web服务提供软件:Microsoft IIS 8.5.9600.16384 IIS调用PHP方法:增加处理 ...
- nvm 设置 nodejs 默认版本
nvm 设置 nodejs 默认版本 windows 系统的版本管理软件是nodist mac系统的node版本管理根据是nvm 每次重启vscode软件后,nvm ls 看到的默认版本都会恢复到v5 ...
- 转载:dos批处理中路径获取
在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% ...