斜率优化dp(玩具装箱)

斜率优化dp

斜率优化dp的思想是数形结合,将各种决策点反映在平面直角坐标系中,然后通过斜率进行优化

做法
首先将这道题的$n^2$的dp 算法写出来
然后将其暴力展开
如:f(i)=min(f(j)+(s[i]-s[j]+i-j-1-l)^2)
令s[i]=s[i]+i,l=l+1
原式变为$f(i)=min(f(j)+(s[i]-s[j]-l)^2)
暴力展开后是长这样的:f(i)=f(j)+s[i]^2+s[j]^2+l^2-2s[i]s[j]-2s[i]l+2s[j]l
我们可以将这个式子的右边转化为这种形式:只和j有关 和i,j有关 只和i有关 以及常数项
f(i)=f(j)+s[j]^2+2s[j]l+2s[i]s[j]+s[i]^2-2s[i][l]+l^2
现在我们可以玄学地令:
b=f[i]
y=f(j)+s[j]^2+2ls[j]
k=-2s[i]
x=s[j]
这样这个式子就转换为了:
b=y-k*x+一堆常数项$
因为当循环到i的时候 s[i]的值是固定的 所以s[i]也可以看做是定值
然后你会发现(常数项不用管,反正是常数嘛对不对,不会变的)
y=kx+b 撒花!(但不是结尾撒花)
这时候就可以用我们可爱的斜率优化了
斜率优化的注释在代码里面 因为没有图所以只能可怜的在代码里面打注释了(玩具装箱)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define ll long long
#define y(T) (f[T]+s[T]*s[T]+2*s[T])
#define x(T) (s[T])
#define k(T) (2*s[T]-2*l)
using namespace std;
const int maxn=50000;
ll n,l;
ll cost[maxn],s[maxn],head,tail,f[maxn];
ll q[maxn];
inline double K(ll cxk,ll nmxl)
{
return 1.0*(y(nmxl)-y(cxk))/(x(nmxl)-x(cxk));
}

signed main()
{
scanf("%lld %lld",&n,&l);
for(register ll i=1;i<=n;i++)
{
scanf("%lld",&cost[i]);
s[i]=s[i-1]+cost[i];
}
for(register ll i=0;i<=n;i++)
s[i]+=i;
head=1;tail=1;//初始化都为1 表示严格包含head和tail区间这样可以表示已经有一个点0在队列里面了 而斜率优化dp必须在一开始的时候压一个点0进去才能保证第一段选出来
for(register ll i=1;i<=n;i++)
{
while(head<tail && K(q[head],q[head+1])<k(i))    //注意此处head<tail因为必须有两个元素
head++;//维护头,显然q[head+1]不是最优解(以后也不会是)弹掉
f[i]=f[q[head]]+(s[i]-s[q[head]]-1-l)*(s[i]-s[q[head]]-1-l);
while(head<tail && K(q[tail],i)<=K(q[tail-1],q[tail]))
tail--; //遇到凹包 需要将再队列中的点斜率大于新加入的点全部弹掉
q[++tail]=i;
}
printf("%lld",f[n]);
return 0;
} 

emm总而言之斜率优化的难点就在于把$n^2$算法的dp写出来之后要进行归纳,神奇的令,以及对队列tail的维护与遇到凹包的时候如何处理
最毒瘤的是初始化以及边界条件 head=1 tail=1 head<tail
然后就没什么了

原文地址:https://www.cnblogs.com/mendessy/p/11650753.html

时间: 2024-10-31 16:04:23

斜率优化dp(玩具装箱)的相关文章

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

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

斜率优化DP总结

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

『土地征用 Land Acquisition 斜率优化DP』

斜率优化DP的综合运用,对斜率优化的新理解. 详细介绍见『玩具装箱TOY 斜率优化DP』 土地征用 Land Acquisition(USACO08MAR) Description Farmer John is considering buying more land for the farm and has his eye on N (1 <= N <= 50,000) additional rectangular plots, each with integer dimensions (1

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

hdu3507之斜率优化DP入门

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

bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏.由于地形的不同,在不同工厂建立仓库的费用可能是不同的.第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci.对

HDU3045 Picnic Cows(斜率优化DP)

Picnic Cows Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2192    Accepted Submission(s): 675 Problem Description It’s summer vocation now. After tedious milking, cows are tired and wish to t