首先比较容易的看出来是DP,w[i]为前i个工厂的最小费用,那么w[i]=min(w[j-1]+cost(j,i))+c[i],但是这样是不work的,复杂度上明显过不去,这样我们考虑优化DP。

  设A[i]=Σp[j](0<j<=i),B[i]=Σp[j]*x[j](0<j<=i),那么我们就可以表示cost(j,i)了。

  cost(j,i)=Σ(x[i]-x[k])*p[k]

      =Σx[i]*p[k]-Σx[k]*p[k]

      =x[i]*(A[i]-A[j-1])-(B[i]-B[j-1])

      =x[i]*A[i]-x[i]*A[j-1]-B[i]+B[j-1]

  对于这个式子我们考虑斜率优化,假设j>k且决策j优于决策k。

  那么有w[j-1]-x[i]*A[j-1]+B[j-1]<w[k-1]-x[i]*B[k-1]+B[k-1]

  那么((w[j-1]+B[j-1])-(w[k-1]+B[k-1]))/(A[j-1]-B[k-1])<x[i]

  这样就是标准的斜率优化了,维护一个上凸壳就行了。

/**************************************************************Problem: 1096User: BLADEVILLanguage: C++Result: AcceptedTime:2648 msMemory:55492 kb
****************************************************************///By BLADEVIL
#include <cstdio>
#define maxn 1000010
#define LL long longusing namespace std;int n;
LL a[maxn],c[maxn],x[maxn],que[maxn];
LL A[maxn],B[maxn],w[maxn];double k(int k,int j)
{double kk;kk=(((w[j-1]+B[j-1])-(w[k-1]+B[k-1]))/(A[j-1]-A[k-1]));return kk;
}int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%lld%lld%lld",&x[i],&a[i],&c[i]);for (int i=1;i<=n;i++) A[i]=A[i-1]+a[i],B[i]=B[i-1]+a[i]*x[i];int h=1,t=0;for (int i=1;i<=n;i++){   for (;(h<t)&&(k(que[t-1],i)<k(que[t-1],que[t]));t--);que[++t]=i;for (;(h<t)&&(k(que[h],que[h+1])<x[i]);h++);int cur=que[h];w[i]=w[cur-1]+x[i]*A[i]-x[i]*A[cur-1]-B[i]+B[cur-1]+c[i];//printf("%d %d\n",h,t);
    }printf("%lld\n",w[n]);return 0;
}

转载于:https://www.cnblogs.com/BLADEVIL/p/3552093.html

bzoj 1096 斜率优化DP相关推荐

  1. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...

  2. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  3. BZOJ 2149 拆迁队 斜率优化DP 主席树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...

  4. bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  5. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  6. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  7. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  8. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  9. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

最新文章

  1. docker删除es数据_docker问题:quot;rpc error: code = 2 desc = containerd: container ...quot;
  2. 《JavaScript权威指南第六版》学习笔记-JavaScript概述
  3. PHP常用功能块_错误和异常处理 — php(32)
  4. 学好Python能做什么?有哪些从业方向?
  5. 离散数学群论_离散数学中的群论及其类型
  6. 以post方式携窗体等参数向服务器发送请求 发出去的字节流 返回的内容
  7. 合天网安就业班_CTF挑战赛-合天网安实验室
  8. Mac电脑上的Safari运行缓慢,卡的要死,该怎么解决?
  9. 专题四——线段树、树状数组
  10. Social Media附加价值开发的四大模式
  11. 用极域课堂管理系统软件批量格式化D盘
  12. Android 配置https抓包
  13. 做项目管理需要哪些技能呢?
  14. 正弦交流电有效值系数sqrt(2)的推导
  15. PIE-Engine教程—中国降水分布可视化加载以2018年为例(含图例添加)
  16. idea激活到2100年
  17. python画图旋转图形_python – 如何将matplotlib图旋转90度?
  18. 高级计划排程APS系统的十二个应用方法
  19. 《十周成为数据分析师》笔记——业务线 第六节 以数据分析为导向的运营体系搭建
  20. STM32智能门锁之调试步进电机

热门文章

  1. jquery学习之1.10-小练习-选中下拉框内容并显示
  2. Posix线程编程指南(4) 线程终止
  3. HTTP代理实现请求报文的拦截与篡改2--功能介绍+源码下载
  4. JWT认证原理、整合springboot实战应用
  5. Fabric学习笔记(一)- Centos 7下的Fabric 2.3.2环境搭建
  6. Yammer Metrics实现服务指标收集与监控
  7. Hive参数性能调优
  8. linux网卡顺序问题,linux网卡绑定及网卡顺序变更测试.docx
  9. spring基础——普通bean xml注入
  10. JVM垃圾回收,面试问到的都有了