描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1096

有\(n\)个工厂,给出第\(i\)个工厂的到1号工厂的距离\(x[i]\),货物数量\(p[i]\),建设仓库所需花费\(c[i]\).

现在要把所有货物都装入仓库,第\(i\)号工厂的货物可以选择在\(i\)建仓库并存入,或者移动到\(k\)号仓库\((i<k<=n)\).移动的花费为数量与距离的乘积.

分析


我们来想一想dp方程.

用\(dp[i]\)表示前\(i\)个工厂,且在\(i\)修建仓库的最少花费.那么有转移方程:$$dp[i]=min\{dp[j]+cost(j+1,i)\}+c[i]$$

其中\(cost(j+1,i)\)表示把\(j+1\)号到\(i\)号的货物全部运送到\(i\)号所需的总花费.

这个\(cost\)怎么求呢?

我们用前缀和\(s1[i]\)表示\(p[1]+p[2]+...+p[i]\).

这样\((s1[i]-s1[j])\times{x[i]})\)就表示把从\(j+1\)号到\(i\)号的所有货物从1号运送到\(i\)号的总花费.

我们发现对于每一个\(k(j+1<=k<=i)\)号工厂,多花费了把\(p[k]\)个货物从1号运送到\(j\)号的花费.我们现在要减去这些多余的花费.

用前缀和\(s2[i]\)表示\(p[1]x[1]+p[2][x2]+...+p[i]x[i]\).

这样\(s2[i]-s2[j]\)就是多余的那些花费了.

但是这样的算法复杂度是\(O(n^2)\)的,注定要爆炸,所以我们考虑用斜率优化的办法把复杂度降到\(O(n)\).

首先变形,原式$$dp[i]=min\{dp[j]+(s1[i]-s1[j])\times{x[i]}-(s2[i]-s2[j])\}+c[i]$$

变形为$$dp[i]=min\{dp[j]+s2[j]-x[i]\times{s1[j]}\}+s1[i]\times{x[i]}-s2[i]+c[i]$$

设\(j<k<i\),\(k\)比\(j\)决策更优.则有$$dp[k]+s2[k]-x[i]\times{s1[k]}<dp[j]+s2[j]-x[i]\times{s1[j]}$$

即$$\frac{(dp[k]+s2[k])-(dp[j]+s2[j])}{s1[k]-s1[j]}<x[i]$$

单调队列搞一搞...

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 typedef long long ll;
 5 const int maxn=1e6+5;
 6 ll n;
 7 ll x[maxn],p[maxn],c[maxn],s1[maxn],s2[maxn],q[maxn],dp[maxn];
 8 inline void read (ll &x){ x=0;ll k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';x*=k; }
 9 inline ll up(int k,int j){ return dp[k]-dp[j]+s2[k]-s2[j]; }
10 inline ll dn(int k,int j){ return s1[k]-s1[j]; }
11 void init(){
12     read(n);
13     for(int i=1;i<=n;i++){
14         read(x[i]), read(p[i]), read(c[i]);
15         s1[i]=s1[i-1]+p[i];
16         s2[i]=s2[i-1]+p[i]*x[i];
17     }
18 }
19 void solve(){
20     ll front=0,tail=1;
21     for(int i=1;i<=n;i++){
22         while(front+1<tail&&up(q[front+1],q[front])<dn(q[front+1],q[front])*x[i]) front++;
23         int j=q[front]; dp[i]=dp[j]+(s1[i]-s1[j])*x[i]-(s2[i]-s2[j])+c[i];
24         while(front+1<tail&&up(i,q[tail-1])*dn(q[tail-1],q[tail-2])<=up(q[tail-1],q[tail-2])*dn(i,q[tail-1])) tail--;
25         q[tail++]=i;
26     }
27     printf("%lld\n",dp[n]);
28 }
29 int main(){
30     init();
31     solve();
32     return 0;
33 }

View Code

1096: [ZJOI2007]仓库建设

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3730  Solved: 1640
[Submit][Status][Discuss]

Description

  L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内
陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象
部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于
地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库
的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设
置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,
假设一件产品运送1个单位距离的费用是1。假设建立的仓库容量都都是足够大的,可以容下所有的产品。你将得到
以下数据:1:工厂i距离工厂1的距离Xi(其中X1=0);2:工厂i目前已有成品数量Pi;:3:在工厂i建立仓库的费用
Ci;请你帮助L公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。

Input

  第一行包含一个整数N,表示工厂的个数。接下来N行每行包含两个整数Xi, Pi, Ci, 意义如题中所述。

Output

  仅包含一个整数,为可以找到最优方案的费用。

Sample Input

3
0 5 10
5 3 100
9 6 10

Sample Output

32

HINT

在工厂1和工厂3建立仓库,建立费用为10+10=20,运输费用为(9-5)*3 = 12,总费用32。如果仅在工厂3建立仓库,建立费用为10,运输费用为(9-0)*5+(9-5)*3=57,总费用67,不如前者优。

【数据规模】

对于100%的数据, N ≤1000000。 所有的Xi, Pi, Ci均在32位带符号整数以内,保证中间计算结果不超过64位带符号整数。

Source

转载于:https://www.cnblogs.com/Sunnie69/p/5575543.html

BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)相关推荐

  1. 【BZOJ1096】仓库建设,斜率优化DP练习

    传送门 写在前面:前来报道的学弟 思路:这是学习斜率优化后完全自己独立处理出的第一个题吧,感觉自己还是太弱,这么就初步理解斜率优化. 先推转移方程,这个还是比较好弄得 f[i]=c[i]+min(f[ ...

  2. jzoj3169-[GDOI2013模拟4]生产汽车【斜率优化dp,单调队列,二分】

    正题 题目大意 有nnn个人mmm辆车. 人有tit_iti​,车有fjf_jfj​.第i个人修第j俩车时间是ti∗fjt_i*f_jti​∗fj​. 一辆车要每个人都修一遍,且一个人修好后要求下一个 ...

  3. bzoj 1096: [ZJOI2007]仓库建设(斜率DP)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5232  Solved: 2324 [Submit][St ...

  4. bzoj1096【ZJOI2007】仓库建设

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec   Memory Limit: 162 MB Submit: 3659   Solved: 1602 [ Submit] ...

  5. 【BZOJ】【1096】【ZJOI2007】仓库建设

    DP/斜率优化 Orz Hzwer 八中好像挂了--明天再提交吧-- UPD:2015-03-12 17:24:43 算了,毕竟是第一道题,还是仔细写一下斜率优化的过程吧.(部分引自Hzwer的题解) ...

  6. 提高篇 第五部分 动态规划 第6章 斜率优化动态规划

    例1 任务安排(TYVJ1098) [tyvj1098]任务安排(dp)_薇小薇-CSDN博客 Tyvj1098 任务安排_Monster__Yi的博客-CSDN博客 P2365 任务安排 任务安排 ...

  7. 九大背包问题专题--多重背包问题(二进制优化方法;单调队列问题)

    3.多重背包问题1 题目: 有N件物品和一个容量是V的背包. 第i种物品最多有si件,每件的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包的容量,且价值总和最大. 输 ...

  8. 多重背包的优化 二进制/单调队列解析

    由于做题的时候老被这玩意儿卡住的我很不爽,决定写个blog来加深自己的印象以及不用到处找资料回忆. 多重背包的问题的具体描述如下: 给出一个体积为v的背包,有n个物品,每个物品可以选c[i]次,问最多 ...

  9. 网站正在建设中_网站建设中图像优化指导原则

    作为专业的网页设计公司,深圳新龙始终追求为客户制作高性能高转化适合SEO的营销型网站.优化图像通常可以减少从网站下载的字节数并提高网站性能.那么新龙如何处理网站建设中的图像呢? 下面讨论我们对待网站图 ...

  10. microsoftexchange邮箱容量怎样看_企业邮箱申请注册的要求有哪些?_网站建设_创客网络...

    随着现在互联网信息化发展的速度不断加快,企业邮箱作为企业之间信息传输的重要工具,其重要性不亚于企业网站,但市场上企业邮箱种类繁多,包含的功能也各不相同,稍有差异,你知道怎么去选择好企业邮箱吗?企业邮箱 ...

最新文章

  1. 帝国cms 标签php,帝国cms常用标签总结
  2. openfiler 搭建虚拟存储 并 配置服务端 (转载)
  3. c语言printf()输出格式控制
  4. hdu3585 二分最大团(dp优化)
  5. 5_1 大理石在哪儿(UVa10474)排序与查找
  6. SharpHsql -- 只适合用于演示数据的数据库引擎
  7. 简便无刷新文件上传系统
  8. axios 是如何封装 HTTP 请求的
  9. HDU1285确定比赛名次(拓扑排序+优先队列)
  10. docker-compose 学习:通过 Dockerfile 和 build 指令搭建 LNMP
  11. 帮你理解vue的数据绑定的流程
  12. 传染病模型系统动力学VENSIM模拟
  13. 【无标题】红外人脸数据集
  14. html table表格重叠,详解html中表格table的行列合并问题解决
  15. 奇兔recovery卡刷教程_奇兔刷机小编为你详解recovery界面中的功能
  16. mysql消除冗余_mysql剔除冗余数据
  17. 如何将r语言结果 输出结果到WORD
  18. 群晖挂载玩客云网络磁盘
  19. 【效率】代码对比工具,我就用这6个
  20. ubuntu防火墙命令介绍

热门文章

  1. 论耐力,哺乳动物中人类可能是第一
  2. 藩国进贡,朝庭厚赐,吃亏了吗?
  3. 用南边代称一个公司,汝竟然也不满?
  4. 从来都是少数决定多数
  5. 对佛教大小无别的弦论解释
  6. gstreamer向appsrc发送编码数据的代码
  7. h文件中报错 unterminated conditional directive的原因
  8. c语言临时变量交换数值,不用临时变量交换两个数的值(C实现)
  9. e盾网络验证源码_趣味设计模式系列:代理模式JDK动态代理源码解析,一文便知
  10. dede rss.php,[经验]dede全站RSS订阅静态输出的办法