斜率优化DP学习笔记

对于一类状态转移方程可以写成

f[i]=min/max(a[i]*b[j]+G[j])+H[i](a、H是只和i有关的函数,b、G是只和j有关的函数)

且a和b至少有一个是单调的动态规划问题,我们可以通过数形结合来优化它。这类问题一般是要把一个线性序列分成若干段,暴力解决时间复杂度一般是O(n^2),如果a和b都是单调的,可以优化到O(n),如果只有一个是单调的,可以优化到O(nlog2n)。。

以取最小值为例,考虑对上面的方程进行变形,H[i]显然和选取最优的转移无关,可以先抹去,将方程变为-a[i]*b[j]+f[i]=G[j],将-a[i]看做斜率,f[i]看做截距,这就是一条直线,斜率一定,要求最小截距。将(b[j],G[j])看做j对应的点,那么我们要做的就是在i对应的状态转移点集中取截距最小的点,也就是拿一条斜率为-a[i]的直线从负无穷向上平移,第一个碰到的点。很显然,这个点一定在i对应点集的凸包上,而且我们是取最小值,所以一定是在下凸壳上,而且是这条直线与这个凸壳的切点。我们要维护这样一个凸壳,这可以用单调队列实现。

先考虑如何取出最优决策,设que是一个横坐标递增的具有下凸性的点集,取出队头的两个点,如果这两点的连线斜率<a[i](如下图)

显然直线不与凸壳相切,又因为斜率是单调(假设是增加)的,所以后面的直线肯定也不会切于这点,这时直接把队头弹出即可。一直这样维护直到队头两点斜率>=a[i],取出队头转移状态即可。

再考虑将点i插入凸壳中,设t1,t2为队尾的两个点,k(i,j)为i,j两点连线斜率,下凸壳的斜率显然是增加的,那么如果出现k(i,t1)<k(t1,t2)时,t1就没有存在的必要了,将它删除即可。

一直这样维护直到出现k(i,t1)>k(t1,t2),就保证了这个队列保存的点集的下凸性。。

有时候斜率和截距不是全单调的。

特殊处理:

横坐标单调:

二分凸包上的点,找到这样一个点x,使得

x和x左边的点的所在的直线斜率小于当前直线斜率

x和x左边的点的所在的直线斜率大于当前直线斜率

将直线插入,维护凸壳

斜率单调:

关于横坐标建立一棵Splay

然后在Splay中维护凸壳

时间: 2024-10-08 21:50:31

斜率优化DP学习笔记的相关文章

【笔记篇】单调队列优化dp学习笔记&amp;&amp;luogu2569_bzoj1855股票交♂易

DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而且有各种各样的类型 优化之类的. 一直dp都不怎么好. 而且也不太知道应该怎么提高. 基本见到不认识的dp方程就不大会推(但我会打表啊= = 所以dp还是很有的学的~ 正好最近刚刚肝了计算几何, 所以就顺带搞一下斜率优化dp一类的... 单调队列优化dp 单调队列大家都会吧? 不会的先出去学一下,

斜率优化DP学习

转自:http://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 我们知道,有些DP方程可以转化成DP[i]=f[j]+x[i]的形式,其中f[j]中保存了只与j相关的量.这样的DP方程我们可以用单调队列进行优化,从而使得O(n^2)的复杂度降到O(n). 可是并不是所有的方程都可以转化成上面的形式,举个例子:dp[i]=dp[j]+(x[i]-x[j])*(x[i]-x[j]).如果把右边的乘法化开的话,会得到x[i]*x[j

hdu3507Print Article(斜率优化dp)

Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 12824    Accepted Submission(s): 3967 Problem Description Zero has an old printer that doesn't work well sometimes. As it is antiqu

斜率优化DP总结

前言: 也是好久没有写题解了,最近主要学习了单调栈单调队列以及斜率优化DP这几个知识点,对于较难的斜率优化DP,做个小小的总结吧. 正(che)文(dan): T1 hdu 3507 在一个风和日丽的早上,你打开了网页,点进了hdu,偶然间看到了这道题,不屑的以为这仅仅是一个很水的DP,2分钟给出DP方程式,很快的写完后发现n的范围居然是500000,这让已经推出来的 O(n2)复杂度的递推式情何以堪,所以就产生了一种高逼格的优化方式:斜率优化. 这道题的方程式是什么呢? dp[i]=min(d

动态规划专题(五)——斜率优化DP

前言 斜率优化\(DP\)是难倒我很久的一个算法,我花了很长时间都难以理解.后来,经过无数次的研究加以对一些例题的理解,总算啃下了这根硬骨头. 基本式子 斜率优化\(DP\)的式子略有些复杂,大致可以表示成这样: \[f_i=min_{j=1}^{i-1}(A(j)-B(j)*S(i)+C(i))\] 其中\(A(j)\)和\(B(j)\)是两个只与\(j\)有关的函数,\(S(i)\)和\(C(i)\)是两个只与\(i\)有关的函数,式子中的\(min\)其实也可以替换成\(max\),但这里

HDU3507 Print Article(经典斜率优化dp)

一道很老的斜率优化dp 斜率优化看上去很难,其实是有技巧的 . 对于dp题目,如果你想优化他,一定要先列出朴素的表达式并观察性质 对于本题我们可以发现,如果要更新dp[i],我们就要从前面找到dp[j]+(s[i]-s[j])^2+m的最小值,其中s是前缀和 我们就可以猜测,一定有很多不可能转移的内容,我们应该如何删除它从而降低复杂度. 那么我们假设k<j,当i出现之后,k就不可能作为答案,那么这些k在i处满足的性质就是 dp[j]+(s[i]-s[j])^2+m<=dp[k]+(s[i]-s

bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路必须在同一天中走完. Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小. 帮助Pine求出最小方差是多少. 设方差是v,可以证明,v×m^2是一个整数.为了避免精度误差,输出结果时输出v×m^2. In

[bzoj 1911][Apio 2010]特别行动队(斜率优化DP)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 分析: 首先可以的到裸的方程f[i]=max{f[j]+a*(Si-Sj)^2+b*(Si-Sj)+c} 0<j<i 简化一下方程,我们知道对于一次项,最后结果肯定是b*Sn 所以可以写成f[i]=max{f[j]+a*(Si-Sj)^2+c} 0<j<i 我们不妨设0<x<y<i,且x比y优 即f[x]+a*(Si-Sx)^2+c>f[y]+a*

hdu 2993 MAX Average Problem (斜率优化dp入门)

MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5855    Accepted Submission(s): 1456 Problem Description Consider a simple sequence which only contains positive integers as