【以前的空间】斜率优化的一点点总结

今天有看了一道dp题,发现好像裸不能过,应该是要斜率优化,结果发现自己那点傻×智商早把这东西忘得差不多,而且当时也是有点乱不是弄得很懂。于是又花了一个早上来整理下。

《用单调性优化动态规划》

这个东西的话很好。但是由于我蒟蒻所以看不懂。先找了模板题到网上找题解,然后跟着题解自己推。那么我就用《[ZJOI2007]仓库建设》来推吧!

首先很容易写出状态转移方程

f[i]:=Min(f[j]+w[j,i])+c[i]

其中f[i]表示前i个的最优状态且在i建一个仓库,j表示上一个仓库的位置。

w[j,i]=p[j+1]*(x[i]-x[j+1])+p[j+2]*(x[i]-x[j+2])+……+p[i-1]*(x[i]-x[i-1])+p[i]*(x[i]-x[i])(p.s 按照论文里面的说法:为了之后的式子好看保留最后一项)。

于是朴素的话就是枚举i之前的j,这样复杂度是o(n2)。

我们把w[j,i]这个式子展开,再合并,得到

w[j,i]=x[i]*(p[j+1]+p[j+2]+……+p[i])-(p[j+1]*x[j+1]+p[j+2]*x[j+2]+……+p[i]*x[i]);

记sum1[i]=Σp[i],sum2[i]=Σp[i]*x[i],然后w[j,i]可化为

w[j,i]=x[i]*(sum1[i]-sum1[j])-(sum2[i]-sum2[j])

=-x[i]*sum1[j]+sum2[j]+x[i]*sum1[i]-sum2[i];

然后把w[j,i]带入原来的方程得到

f[i]:=Min(f[j]+sum2[j]-x[i]*sum1[j])+x[i]*sum1[i]-sum2[i]+c[i] (后面几个都是根据i唯一确定的,所以可以从Min中提取出来)

然后就是斜率优化的东西了!

把Min中由i确定的看成是系数,也就是这个方程中的-x[i],先设为a。

把与系数相乘的那个设为x,也就是这个方程中的sum1[j]。

把剩下的那些东西都设为y,也就是这个方程中的sum2[j]+f[j]。

最后把f[i]设为G。

然后就变成G=ax+y,进而得到y=-ax+G。之后就是论文里面一些balabala的东西了。

但是我觉得这样解释不如另一种解释斜率优化好(便于像我这样的蒟蒻理解):

设j,k为i之前两个决策点,且i>j>k,以及j决策要优于k决策

那么f[j]+w[j,i]<f[k]+w[k,i]

也就是f[j]+sum2[j]-x[i]*sum1[j]<f[k]+sum2[k]-x[i]*sum1[k]

移项就是f[j]+sum2[j]-f[k]-sum2[k]<x[i]*(sum1[j]-sum1[k])

然后用之前说的x,y,a代替就是

y(j)-y(k)<a*(x(j)-x(k))

然后x是单调递增的所以x(j)>x(k),所以除过去得到

(y(j)-y(k))/(x(j)-x(k))<a 然后这个式子不就是斜率的公式么……

所以若k<j且j优于k则满足上面这个式子。

然后就是维护规则了。

维护一个单调队列,里面记录决策的位置,且里面的决策的位置都是单调递增的。

首先对于当前i来说,它的最优决策就是满足(y(j)-y(k))/(x(j)-x(k))<a的最大一个j。于是从队头head开始,如果(y(head+1)-y(head))/(x(head+1)-x(head))<a就是head++,这样就可以找到(y(j)-y(k))/(x(j)-x(k))<a的最大一个j。也就是这时的head就是i的最优决策,于是f[i]=f[q[head]]+w[head,i]+c[i]。

然后就是把i加入队列中,同样也是要满足(y(j)-y(k))/(x(j)-x(k))<a,不过是要考虑进三个决策之间斜率的关系。由于斜率是单调递增的,且(y(tail)-y(tail-1))/(x(tail)-x(tail-1))<a(tail),(y(i)-y(tail))/(x(i)-x(tail))<a(i),所以(y(tail)-y(tail-1))/(x(tail)-x(tail-1))<(y(i)-y(tail))/(x(i)-x(tail)),按照这个规则维护,如果tail不符合这个规则那么tail--,直到tail符合,然后把决策i加入决策队列中,即q[++tail]=i。

然后就是这样了!

时间: 2024-10-11 12:37:01

【以前的空间】斜率优化的一点点总结的相关文章

【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化

[BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先进的机械设备生产先进的机器.原来的那一台生产机器已经坏了,所以你要去为公司买一台新的生产机器.你的任务是在转型期内尽可能得到更大的收益.在这段时间内,你要买卖机器,并且当机器被ACM公司拥有的时候,操控这些机器以获取利润.因为空间的限制,ACM公司在任何时候都只能最多拥有一台机器. 在转型期内,有若

(中等) CF 311B Cats Transport,斜率优化DP。

Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight road across the farm and n hills along the road, numbered from 1 to n from left to right. The distance between hill i and (i - 1) is di meters. The fee

hdu3507 Print Article[斜率优化dp入门题]

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

_bzoj1096 [ZJOI2007]仓库建设【斜率优化dp】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 又是一道经典斜率优化. #include <cstdio> const int maxn = 1000005; int n, c[maxn], head, tail, x[maxn]; long long sp[maxn], sxp[maxn], f[maxn]; char ch; struct point { long long x, y; int id; } que[maxn]

BZOJ - 1010【斜率优化DP】

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9961  Solved: 4056[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压 缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过 压缩后变成一维长度为Ci.为了方便整理

斜率优化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

bzoj 1010 玩具装箱toy -斜率优化

P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的.同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j个玩具放到一个容器中,那么容器的长度将为 x=j-i+Sigma(Ck) i<=K<=j 制作容器的

BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][Status][Discuss] Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P

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