斜率优化Convex Hull Trick
斜率优化
一、简单DP
首先从一道简单题引入。
[IOI2002]任务安排
Description
N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务。从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。在每批任务开始前,机器需要启动时间S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完成)。每个任务的费用是它的完成时刻乘以一个费用系数ci。请确定一个分组方案,使得总费用最小。
例如:S=1;T={1,3,4,2,1};F={3,2,3,3,4}。如果分组方案是{1,2}、{3}、{4,5},则完成时间分别为{5,5,10,14,14},费用C={15,10,30,42,56},总费用就是153。
Input
第一行是N(1<=N<=5000)。
第二行是S(0<=S<=50)。
下面N行每行有一对数,分别为Ti和ci,均为不大于100的正整数,表示第i个任务单独完成所需的时间是Ti及其费用系数ci。
Output
一个数,最小的总费用。
Sample Input
5
1
1 3
3 2
4 3
2 3
1 4
Sample Output
153
Solution
“光着身子”的动态规划。
设F[i,j]表示划分前i个任务为j批的最小费用。
,时间复杂度:,空间复杂度:
这显然是不够的。
实际上我们不一定要知道之前划分了多少批任务,只需要记录F[i]表示划分前i个任务的最小费用。
这样就写出了动态规划方程。
二、简单题2
将上题的n<=5000改为n<=300000。
Solution
这就是本文的重点所在了。
在上文中的动态规划中,尚有两种简单的优化思路:
- 优化状态:将这样一个动态规划转化为贪心或数学题。
- 优化转移:优化转移的时间(主要为优化重复或不必要的转移)。
显然,优化状态很难达成,那么我们考虑优化转移。
我们可以发现在转移的过程中有很多的不必要的转移:
考虑一下两个转移:
在此题中,若
那么转移 j 就是不必要的。
也就是说,若有且选取转移状态的集合
并且存在,后面的转移比前面的优,则前面的转移就是无意义的,也就是对最终答案无贡献的了。
考虑本题,如何判断转移状态是否是有用的呢?
也就是说,如果
那么后面的转移比前面的优,否则前面的转移比后面的优。
这样的,即是用斜率的形式,表现了转移之间的不必要的关系。
进一步,我们发现:
也就是说,如果当前存在后面的转移比前面的优,那么这个转移在之后的状态中都不会成为最有转移!
根据这个性质,我们选择用单调队列维护一个两点间斜率单调递增的点集队列。
设:
- 若有 ,则的转移必然不会是最优的,于是能够将它删除。(维护队尾)
- 若有, 则x1的转移必然不会是最优的,于是能够将它删除。 (维护队首)
最后的点集队列满足:在队首的点的转移必然是最优的。
于是
将转移化为,动态规划完成。
三、简单题3
若 -512<=t[i]<=512 ,也就是说:
不再成立怎么办呢?
我们发现:
- 若有 ,则的转移必然不会是最优的,于是能够将它删除。(维护队尾)
这一性质依然成立,那么这个点集集合还是会组成一个相邻点斜率递增的单调队列。
有
发现:
- 如果,那么优于。
- 如果,那么优于。
也就是说,答案一定存在于一个点,使得 且
那么必然最优。
我们可以维护单调队列,只在队尾删除,每次二分查询一个最优点。
这样便是的斜率优化做法。
四、简单题4
一种形式斜率优化的形式:
队列中的点不满足单调性。
BZOJ1492: [NOI2007]货币兑换Cash
题目描述:详见BZOJ。
这一题就是典型的例子。
斜率不单调,那么就必须用cdq分治或splay维护斜率凸包解决斜率优化问题了。
下次有时间再补充。。。
斜率优化Convex Hull Trick相关推荐
- FZU-2239 Daxia Yayamao's problem(斜率优化)
Daxia & Yayamao's problem FZU - 2239 题解:f(x)=A*x+B 如果j>k,Aj>Ak,Aj*x+Bj>=Ak*x+Bk,则(Bj-Bk ...
- BZOJ1597: [Usaco2008 Mar]土地购买(dp 斜率优化)
题意 题目链接 Sol 重新看了一遍斜率优化,感觉又有了一些新的认识. 首先把土地按照\((w, h)\)排序,用单调栈处理出每个位置第向左第一个比他大的位置,显然这中间的元素是没用的 设\(f[i] ...
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- 【BZOJ3963】[WF2011]MachineWorks cdq分治+斜率优化
[BZOJ3963][WF2011]MachineWorks Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM)的经理,公司使用更加先 ...
- R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)
R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- 实用线性代数和凸优化 Convex Optimization
If not specified, the following conditions are assumed. X∈Rn∗mA∈Rm∗nX \in R^{n*m} \\ A \in R^{m*n} X ...
- uva 10256 The Great Divide (Convex Hull, Simple)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=sh ...
- 『玩具装箱TOY 斜率优化DP』
玩具装箱TOY(HNOI2008) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊 ...
最新文章
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
- mongodb 查多个不等于_高可用架构之商城的mongodb设计分析
- js html模板生成图片不显示,网页中图片不显示问题
- 【详解】指令系统中跳转指令与OF,SF,CF,ZF的关系
- Orange Business Services 携手 Riverbed 将 SD-WAN 引入混合网络
- Amazon DynamoDB应用—为table指定Provisioned Throughput
- 路由器就能赚钱? 揭秘京东云无线宝背后的黑科技
- 10个常见的Android 新手误区
- 计算机主机的光驱怎么打开,笔记本电脑光驱怎么打开?高手教你打开笔记本光驱的方法...
- 生日快乐程序_「秒福」小程序:送祝福,2020我们不一样
- spring中使用Aspectj进行切面编程
- 产品原则和产品评审团
- win10计算机怎么连接网络,win10怎么设置宽带连接,教您修复宽带连接问题
- 1月书讯:Hello 2021! (下)
- kafka segment file 解析
- Spring的DI(依赖注入xml版)
- iCloud邮件客户端配置
- 华为开发者大会2021鸿蒙系统,鸿蒙2.0来了!华为开发者大会HDC 2020宣布
- DDoS攻击的原理是什么
- MQL4 判断double 数值近似值相等
热门文章
- 您的屁股发热严重,请降温后使用。
- 从网恋到失恋只需要一秒...
- MATLAB图像处理与数字信号处理资料分享来袭
- Prim 算法及其高效实现
- 从概念到案例:初学者须知的十大机器学习算法
- c++ 异步下获取线程执行结果_前端异步编程的那些事
- linux docker导入镜像,Docker镜像的导入和导出
- java程序编六角星_跨平台移动端解决方案—Weex
- linux phpunit 安装,PHPUnit安装教程
- java综合图形界面程序设计_java综合图形界面程序设计.doc