DP斜率优化
BrooksBUAA
这个作者很懒,什么都没留下…
展开
-
[BZOJ 1911][Apio2010]特别行动队:DP斜率优化
点击这里查看原题DP方程: f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c)如果j>k且j比k更优,则 f[j]-f[k]+a*sum[j]^2-a*sum[k]^2+b*(sum[k]-sum[j])>2*a*(sum[j]-sum[k])*sum[i]/*User:SmallLanguage:C++Problem No原创 2017-04-07 11:39:45 · 290 阅读 · 0 评论 -
[BZOJ 3963][WF2011]MachineWorks:CDQ分治|DP斜率优化
点击这里查看原题把所有点按时间排好序,得到方程: f[i]=max{f[j]-p[j]+r[j]+g[j]*(d[i]-d[j]-1)}设x[j]=g[j],y[j]=f[j]-p[j]+r[j]-g[j]*(d[j]+1),则: y[j]=-d[i]*x[j]+f[i]于是维护一个上凸壳进行斜率优化。 但是由于凸壳中的点需要按x坐标排好序,因此需要进行CDQ分治,左区间按x坐标排序维原创 2017-04-07 15:33:58 · 408 阅读 · 0 评论 -
[BZOJ 1096][ZJOI2007]仓库建设:DP斜率优化
点击这里查看原题典型的斜率优化,主要难点在于如何计算搬运物品的费用,可以维护两个值,tot[i]表示物品总数的前缀和,sum[i]表示将i之前所有物品运到i的总费用,那么将j-i之间所有物品搬运到i的总费用即为去除将1-j之间的物品搬到i的费用,sum[i]-sum[j]-tot[j]*(dis[i]-dis[j])/*User:SmallLanguage:C++Problem No.:109原创 2017-04-07 19:16:22 · 289 阅读 · 0 评论 -
[BZOJ 3156]防御准备:DP斜率优化
点击这里查看原题和BZOJ 1096有点类似,不过这次简化了,计算j-i之间的检查点全依赖于i的花费为sum[i]-sum[j]-j*(i-j)。 f[i]表示在i点放置防御塔且之前的检查点均已处理好的最小花费,则方程为:f[i]=max{f[j]+a[i]+sum[i]-sum[j]-j*(i-j)},最后所求答案为f[n]。/*User:SmallLanguage:C++Problem原创 2017-04-08 08:51:55 · 239 阅读 · 0 评论 -
[BZOJ 3437]小P的牧场:DP斜率优化
点击这里查看原题和BZOJ 1096类似,方程:f[i]=max{f[j]+a[i]+sum[i]-sum[j]-tot[j]*(i-j)}/*User:SmallLanguage:C++Problem No.:3437*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace s原创 2017-04-08 09:07:56 · 440 阅读 · 0 评论 -
[BZOJ 3675][Apio2014]序列分割:DP斜率优化
点击这里查看原题DP方程:f[i][j]=max{f[i-1][k]+(sum[n]-sum[j])*(sum[j]-sum[k])} 可以使用斜率优化,复杂度O(nk),外侧循环切割次数,内层循环切割位置。不过注意,因为空间只有128mb,因此要使用滚动数组。(如果在BZOJ上交出现了0ms的TLE,一定是因为MLE了)/*User:SmallLanguage:C++Problem No.原创 2017-04-08 10:27:31 · 516 阅读 · 0 评论 -
[BZOJ 1492][NOI2007]货币兑换Cash:CDQ分治|DP斜率优化
点击这里查看原题首先贪心的想,每次买卖必然要买空或者卖空,因为有便宜就尽量去占,于是可以得到方程: f[i]=max{f[j]/(a[j]*rate[j]+b[j])*rate[j]*a[i]+f[j]/(a[j]*rate[j]+b[j])*b[i]}其中,x[j]=f[j]/(a[j]*rate[j]+b[j])*rate[j]表示第j天最多可以拥有的A货币的数量,y[j]=f[j]/(a原创 2017-04-06 10:16:28 · 519 阅读 · 0 评论 -
[BZOJ 1597][Usaco2008 Mar]土地购买:DP斜率优化
点击这里查看原题按X坐标排序,若有某个点X,Y坐标均小于另一个点,则删去该点。 首先可以写出DP方程: f[i]=min{f[j]+x[i]*y[j+1]}这个方程可以用斜率优化,由此维护一个下凸壳即可得解: (f[j]-f[k])/(y[k+1]-y[j+1])/*User:SmallLanguage:C++Problem No.:1597*/#include<bits/st原创 2017-04-05 19:03:29 · 265 阅读 · 0 评论 -
[BZOJ1010]玩具装箱:DP决策单调性
题目请点击这里首先可以得到方程: f[i]=max{f[j]+(sum[i]-sum[j]+i-j-1-L)^2}显而易见该方程具有单调性,因此可以使用决策单调性优化,维护一个下凸壳,每次将当前队首决策取出直至当前决策为最优,然后将当前点加入队尾,若有斜率小于当前点的则先取出后加入。/*User:SmallLanguage:C++Problem No.:1010*/#include<原创 2017-03-13 21:37:58 · 677 阅读 · 0 评论