【BZOJ】【1096】【ZJOI2007】仓库建设
DP/斜率优化
Orz Hzwer
八中好像挂了……明天再提交吧……
UPD:2015-03-12 17:24:43
算了,毕竟是第一道题,还是仔细写一下斜率优化的过程吧。(部分引自Hzwer的题解)
首先我们根据题意可以列出动规方程 $$ f[i]=min\{ f[j]+cal(j,i) \}$$
处理$cal(j,i)$可以利用前缀和的思想,令$ sum[i]=\sum_{k=1}^{i} p[k] $
对于物品$1 ~ i$,如果都从$0$运到$i$,则费用为$(sum[i]-sum[j])*x[i]$
但由于物品的起始点不都在0,所以对于每个物品$k$可以少花费$x[k]*p[k]$
定义$b[i]=\sum_{k=1}^{i} (x[k]*p[k]) $
可得 $ f[i]=min\{ f[j]+(sum[i]-sum[j])*x[i]-(b[i]-b[j])+c[i] \} $
下面证明决策单调性:
如果$ j > k $ 且$j$比$k$更优,则有:
\[ \begin{aligned} f[j]+(sum[i]-sum[j])*x[i]-(b[i]-b[j])+c[i] &< f[k]+(sum[i]-sum[j])*x[i]-(b[i]-b[k])+c[i] \\ f[j]-f[k]+b[j]-b[k] &< (sum[j]-sum[k])*x[i] \\ \frac{f[j]-f[k]+b[j]-b[k]}{sum[j]-sum[k]} &< x[i] \end{aligned} \]
至于为什么要证这个东西请看论文:《动态规划的斜率优化》
嗯我们现在就知道了对于每个状态$i$,从1 ~ i-1这些决策中的“当前最优决策”是有一个单调性的!比如我们从1开始枚举到 k ,发现 k 是一个最优决策可以更新答案f[i],然后我们继续枚举直到决策 j ,满足上面那个不等式!则表明决策 j 比决策 k 更优!那么有什么用呢?我们根据不等式发现,这个“更优”的属性,只跟 j 和 k 有关,与阶段 i 是无关的!也就是说,当 j 成为一个可选的方案的时候,k 就永远也不用再考虑它了,这就大大减少了转移时的决策数!从而降低了复杂度!
说的好像很厉害……那具体操作的时候怎么操作呢?
我们用一个队列q来维护一个斜率单调的决策序列:
如果slop(q[l],q[l+1])<x[i](参考上面推出的不等式)则说明q[l+1]这个决策比q[l]这个决策更优,所以l++舍弃队首
算出dp[i]
如果slop(q[r-1],q[r])>slop(q[r],i),则队尾处不满足单调,所以要弹队尾直到满足单调性(联系凸壳的图形想想)
插入决策 i 到队列尾部
当然如果换了一道求max的题,则不等号方向是要改变的……
/**************************************************************
Problem: 1096
User: Tunix
Language: C++
Result: Accepted
Time:1784 ms
Memory:52052 kb
****************************************************************/ //BZOJ 1096
#include<cstdio>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=;
typedef long long LL;
/******************tamplate*********************/
int n,l,r,q[N];
LL p[N],x[N],c[N],f[N],b[N],sp[N];
inline double slop(int k,int j){
return double(f[j]-f[k]+b[j]-b[k])/double(sp[j]-sp[k]);
}
int main(){
int n=getint();
F(i,,n){
x[i]=getint(); p[i]=getint(); c[i]=getint();
sp[i]=sp[i-]+p[i]; b[i]=b[i-]+p[i]*x[i];
}
F(i,,n){
while(l<r && slop(q[l],q[l+])<x[i]) l++;
int t=q[l];
f[i]=f[t]-b[i]+b[t]+(sp[i]-sp[t])*x[i]+c[i];
while(l<r && slop(q[r-],q[r])>slop(q[r],i))r--;
q[++r]=i;
}
printf("%lld\n",f[n]);
return ;
}
【BZOJ】【1096】【ZJOI2007】仓库建设的更多相关文章
- BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4201 Solved: 1851[Submit][Stat ...
- bzoj 1096: [ZJOI2007]仓库建设 斜率優化
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2242 Solved: 925[Submit][Statu ...
- bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3234 Solved: 1388[Submit][Stat ...
- BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )
dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...
- 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法
[原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1998 Solved: 816 [id=10 ...
- BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...
- BZOJ 1096 ZJOI2007 仓库建设 边坡优化
标题效果:特定n植物,其中一些建筑仓库,有一点使,假设没有仓库仓库向右仓库.最低消费要求 非常easy边坡优化--在此之前刷坡优化的情况下,即使这道题怎么错过 订购f[i]作为i点建设化妆i花费所有安 ...
- ●BZOJ 1096 [ZJOI2007]仓库建设
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题解: 斜率优化DP $(d_i:i 位置到1位置的距离,p_i:i位置的成品数量,c ...
- BZOJ 1096 [ZJOI2007]仓库建设:斜率优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1096 题意: 有n个工厂,从左往右排成一排,分别编号1到n. 每个工厂里有p[i]件产品, ...
- bzoj 1096: [ZJOI2007]仓库建设【斜率优化】
好眼熟啊 直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数 转移很显然,设s为p的前缀和,f[i]=max{f[j]+ ...
随机推荐
- ORMLiteDatabase的简单使用并且与其他的表相互联系
1.下载jar 具体到Android,需要在 http://ormlite.com/releases 页面下载两个jar 包(本文基于ORMLite的版本是:ormlite 4.49-SNAPSHOT ...
- android JSON 技术
json 语法检查和在线解析网址:http://json.parser.online.fr/ limengwe android Json解析详解(详细代码) http://blog.csdn.net/ ...
- sql中with as的用法练习
在工作中经常看到有人使用with as,查询很顺畅,也很快,很好奇,在网上也有不少资料,看了大神的文章,也练习一下. 首先给出两位位大神文章的链接,介绍十分详细:http://www.cnblogs. ...
- STM32F4_引领入门
Ⅰ.概述 该文写给那些想学ST芯片开发(或初级学习)的朋友,文章着重细节,或许有点简单. 笔者想告诉那些刚开始学习ST的朋友,不管你使用哪一个系列(F0.F1.F2),哪一种型号芯片,其实学习的方法和 ...
- pure的bug记录2
<select id="stacked-state" style=" font-family: "Microsoft YaHei"; " ...
- python 循环、循环设计、循环对象
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 1.循环 循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进 ...
- 苹果内付费 IAP
创建app内购买项目 消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买.一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵. 非消耗型项目:对于非消耗型App内购买项目,用户仅 ...
- Android Service学习之本地服务
Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...
- EF 随机排序
/// <summary> /// 数据上下文扩展 /// </summary> public partial class dbDataContext : IUnitOfWor ...
- MEF(Managed Extensibility Framework) 微软平台插件化开发
体验Managed Extensibility Framework精妙的设计 MEF(Managed Extensibility Framework)是.NET Framework 4.0一个重要 ...