斜率优化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,j]=min(F[k,j-1]+(s*j+\sum_{q=k+1}^{i}t[q] ))*(\sum_{q=k+1}^{i}c[q]))

设T[i]=\sum_{j=1}^{i}t[j]                 C[i]=\sum_{j=1}^{i}c[i]

F[i,j]=min(F[k,j-1]+(s*j+T[i]-T[k] ))*(C[i]-C[k]))

(2D/1D),时间复杂度:O(n^3),空间复杂度:O(n^2)

这显然是不够的。

 

实际上我们不一定要知道之前划分了多少批任务,只需要记录F[i]表示划分前i个任务的最小费用。

F[i]=min(F[j]+(s+T[i])*(C[i]-C[j]))+s*(C[n]-C[i])

这样就写出了(1D/1D)动态规划方程。

二、简单题2

将上题的n<=5000改为n<=300000。

Solution

这就是本文的重点所在了。

在上文中的(1D/1D)动态规划中,尚有两种简单的优化思路:

  1. 优化状态:将这样一个动态规划转化为贪心或数学题。
  2. 优化转移:优化转移的时间(主要为优化重复或不必要的转移)。

显然,优化状态很难达成,那么我们考虑优化转移。

我们可以发现在转移的过程中有很多的不必要的转移:

考虑一下两个转移:

F[i]=min(F[j]+(s+T[i])*(C[i]-C[j]))+s*(C[n]-C[i])

F[i]=min(F[k]+(s+T[i])*(C[i]-C[k]))+s*(C[n]-C[i])

(j<k<i)

在此题中,若 min(F[j]+(s+T[i])*(C[i]-C[j]))\geqslant min(F[k]+(s+T[i])*(C[i]-C[k]))

那么转移 j 就是不必要的。

也就是说,若有(i'>i)且选取转移状态的集合\begin{Bmatrix} i':& j1, &j2, &... &j\alpha \end{Bmatrix}\subseteq \begin{Bmatrix} i:& j1, &j2, &... &j\beta \end{Bmatrix}

并且存在,后面的转移比前面的优,则前面的转移就是无意义的,也就是对最终答案无贡献的了。

 

考虑本题,如何判断转移状态是否是有用的呢?

F[j]+(s+T[i])*(C[i]-C[j])\geqslant F[k]+(s+T[i])*(C[i]-C[k])

\therefore F[j]-s*c[j]-T[i]*c[j]\geqslant F[k]-s*c[k]-T[i]*c[k]

\therefore F[j]-f[k]+s*(c[k]-c[j])\geqslant T[i]*(c[j]-c[k])

\therefore \frac{F[j]-f[k]+s*(c[k]-c[j]))}{(c[j]-c[k]) }\leqslant T[i]

也就是说,如果 \small \frac{F[j]-f[k]+s*(c[k]-c[j]))}{(c[j]-c[k]) }\leqslant T[i]

那么后面的转移比前面的优,否则前面的转移比后面的优。

这样的\small \frac{F[j]-f[k]+s*(c[k]-c[j]))}{(c[j]-c[k]) },即是用斜率的形式,表现了转移之间的不必要的关系。

 

进一步,我们发现:

\small \frac{F[j]-f[k]+s*(c[k]-c[j]))}{(c[j]-c[k]) }\leqslant T[i]\leqslant T[i+1]

也就是说,如果当前存在后面的转移比前面的优,那么这个转移在之后的状态中都不会成为最有转移!

根据这个性质,我们选择用单调队列维护一个两点间斜率单调递增的点集队列。

设:

\small g(x1,x2)=\frac{F[x1]-f[x2]+s*(c[x2]-c[x1]))}{(c[x1]-c[x2]) }

  1. 若有  \small g(x1,x2)\geqslant g(x2,x3),则\small x2的转移必然不会是最优的,于是能够将它删除。(维护队尾)
  2. 若有\small g(x1,x2)<=T[i],        则x1的转移必然不会是最优的,于是能够将它删除。 (维护队首)

最后的点集队列满足:在队首的点的转移必然是最优的。

于是\small F[i]=F[que[head]]+(s+T[i])*(C[i]-C[que[head]])+s*(C[n]-C[i])

将转移化为O(1)(1D/0D)动态规划完成。

三、简单题3

若   -512<=t[i]<=512 ,也就是说:

\small T[i]\leqslant T[i+1]    不再成立怎么办呢?

我们发现:

  1. 若有  \small g(x1,x2)\geqslant g(x2,x3),则\small x2的转移必然不会是最优的,于是能够将它删除。(维护队尾)

这一性质依然成立,那么这个点集集合还是会组成一个相邻点斜率递增的单调队列。

\small g(x1,x2)\leqslant g(x2,x3)...\leqslant g(x\alpha ,x\alpha+1 )<=T[i]<=g()...   

发现:

  1. 如果\small g(x\alpha ,x\alpha+1 )< T[i],那么\small x\alpha +1优于\small x\alpha
  2. 如果\small g(x\alpha ,x\alpha+1 )> T[i],那么\small x\alpha优于\small x\alpha +1

也就是说,答案一定存在于一个点\small x\alpha,使得g(x\alpha-1,x\alpha ) \leqslant T[i] 且 g(x\alpha,x\alpha +1) \geqslant T[i]

那么\small x\alpha必然最优。

我们可以维护单调队列,只在队尾删除,每次二分查询一个最优点。

这样便是O(nlgn)的斜率优化做法。

 

四、简单题4

一种形式斜率优化的形式:

队列中的点不满足单调性。

BZOJ1492: [NOI2007]货币兑换Cash

题目描述:详见BZOJ。

这一题就是典型的例子。

斜率不单调,那么就必须用cdq分治或splay维护斜率凸包解决斜率优化问题了。

下次有时间再补充。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式部署携程Apollo构建配置中心

一、开场白在系统设计里我们有很多配置希望独立于系统之外&#xff0c;而又能够被系统实时读取。但是在传统的系统设计里&#xff0c;配置信息通常是耦合在系统内的&#xff0c;比如.net里通常会放在App.config或者web.config里&#xff0c;.net core则是appsettings.json里&am…

[COCI 2017-2018-2]-San

[COCI 2017-2018-2]-San san(1s64M) 游戏世界中有N个楼从左到右排列&#xff0c;从左到右编号为1到N&#xff0c;第i幢楼的高度为Hi,楼上的金币数为Gi,游戏可以从任意一个楼开始且包涵几步。每一步玩家可以从当前位置向右跳&#xff08;可以跳过一些楼&#xff09;但必须跳到…

领域模型架构 eShopOnWeb项目分析 上

一.概述本篇继续探讨web应用架构&#xff0c;讲基于DDD风格下最初的领域模型架构&#xff0c;不同于DDD风格下CQRS架构&#xff0c;二者架构主要区别是领域层的变化。 架构的演变是从领域模型到CQRS, 一开始DDD是用领域模型的分层架构&#xff0c;用单一的领域模型处理业务逻辑…

最小生成树--Boruvka算法

参考文章 介绍 第一次听说这个算法。。 对于最小生成树一定学过prim和krusal&#xff0c;prim复杂度是O(n2)或者O(elogn)O(n^2)或者O(elogn)O(n2)或者O(elogn),krusal复杂度是O(eloge)O(eloge)O(eloge)&#xff0c;这里介绍一下Boruvka算法 Boruvka算法解决某些特定问题非常好…

[NOIP2016]愤怒的小鸟(状压DP)

[NOIP2016]愤怒的小鸟&#xff08;状压DP&#xff09; 题目描述 输入输出格式 输入格式&#xff1a; 第一行包含一个正整数 T&#xff0c;表示游戏的关卡总数。 下面依次输入这 T个关卡的信息。每个关卡第一行包含两个非负整数 n,m&#xff0c;分别表示该关卡中的小猪数量和…

给 asp.net core 写一个简单的健康检查

给 asp.net core 写一个简单的健康检查Intro健康检查可以帮助我们知道应用的当前状态是不是处于良好状态&#xff0c;现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应用的健康状态&#xff0c;如果应用本身就提供一个健康检查的机制…

从阿里中台战略看企业IT架构转型之道(下)

此文是我阅读《企业IT架构转型之道》一书的学习笔记的下半部分&#xff0c;所有内容出自钟华老师的这本书。上半部分Part1~Part5请点击这里Part 6 异步与缓存原则异步化事务 > 核心是ACID柔性事务 > 基础是CAP理论和BASE理论&#xff0c;因为互联网应用最核心的需求是高可…

CF1543C. Need for Pink Slips

CF1543C. Need for Pink Slips 题意&#xff1a; 题解&#xff1a; 其实具体的计算方法在说明里面都写了&#xff1a;对于第一个数据&#xff1a; 0.2 0.2 0.6 0.2组成方案如下&#xff1a; 就是c和m如果大于v就减&#xff0c;小于v就变成0&#xff0c;到p直接停止 所以直接…

并查集(并茶几)

并查集&#xff08;并茶几&#xff09;的应用 一、What‘s that&#xff1f; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合&#xff08;Disjoint Sets&#xff09;的合并及查询问题。常常在使用中以森林来表示。 ——百度百科 二、How to uphold 0.我们的需…

从阿里中台战略看企业IT架构转型之道(上)

此文是我阅读《企业IT架构转型之道》一书的学习笔记的上半部分&#xff0c;所有内容出自钟华老师的这本书。零、为何阅读《企业IT架构转型之道》在加入X公司后&#xff0c;开始了微服务架构的实践&#xff0c;也开始了共享平台服务的建设&#xff0c;在这方面阿里巴巴的中台战略…

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

通过上文所介绍的内容&#xff0c;我们已经完成了RESTful API的开发&#xff0c;现在&#xff0c;就可以使用Azure DevOps来进行持续集成&#xff08;CI&#xff09;和k8s持续部署&#xff08;CD&#xff09;了。本文我会对使用Azure DevOps进行CI/CD的过程中需要注意的地方进行…

P3195 [HNOI2008]玩具装箱

P3195 [HNOI2008]玩具装箱 题意&#xff1a; n件玩具&#xff0c;第i件玩具经过压缩后的一维长度为CiC_iCi​,现在把玩具装入一维容器中&#xff0c;要求&#xff1a; 在一个一维容器中的玩具编号是连续的如果一个一维容器中有多个玩具&#xff0c;那么两件玩具之间要加入一…

卷积与莫比乌斯反演

卷积与莫比乌斯反演 目录 卷积与莫比乌斯反演 0前言 0.1前置技能 0.2问题的引入 1.简单定义 1.1数论函数的定义 1.2卷积的定义 1.3反演的基本形式 2.1莫比乌斯反演 3.1例题&#xff1a;【luogu-P2257 YY的GCD】 题目大意&#xff1a; solution1 solution2 0.前言 莫比…

ML.NET机器学习、API容器化与Azure DevOps实践(三):RESTful API

通过上文所述案例&#xff0c;我们已经选择了最优回归算法来预测学生的综合成绩&#xff0c;并且完成了基于训练数据集的预测模型训练。从实现上&#xff0c;训练好的模型被保存成一个ZIP文件&#xff0c;以便在其它项目中直接调用以完成机器学习的实践场景。在本文中&#xff…

杜教筛

杜教筛 1.概述 杜教筛是用以解决积性函数前缀和的算法。 在学习了莫比乌斯反演之后&#xff0c;杜教筛的过程就会显得简单而自然。 2.基本形式 对于积性函数&#xff0c;我们定义如下函数&#xff1a; 构造积性函数 &#xff0c;使得 显然 &#xff1a; 进一步转化&#xf…

ML.NET机器学习、API容器化与Azure DevOps实践(二):案例

在上文中&#xff0c;我简单地介绍了机器学习以及ML.NET的相关知识&#xff0c;从本讲开始&#xff0c;我会基于一个简单的案例&#xff1a;学生成绩预测&#xff0c;来介绍使用ML.NET进行机器学习以及API部署的基本过程。本案例的数据来源为加州大学尔湾分校的机器学习公开样本…

业界萌新对斯坦纳树的小结

业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题&#xff0c;与最小生成树相似&#xff0c;是最短网络的一种。最小生成树是在给定的点集和边中寻求最短网络使所有点连通。而最小斯坦纳树允许在给定点外增加额外的点&#xff0c;使生成的最短网络开销最小。 ——…

cf1208E. Let Them Slide

cf1208E. Let Them Slide 题意&#xff1a; 都放在一个长度为W的框里面。有n个序到&#xff0c;第i个序列的长度是1。这些序到并排放在一起&#xff0c;每一个序列都放在一个长度为w的框里 这些序列可以在框里面滑动&#xff0c;但是不能划出框。 对于每一个位置&#xff0…

结合eShopOnWeb全面认识领域模型架构

一.项目分析在上篇中介绍了什么是"干净架构"&#xff0c;DDD符合了这种干净架构的特点&#xff0c;重点描述了DDD架构遵循的依赖倒置原则&#xff0c;使软件达到了低藕合。eShopOnWeb项目是学习DDD领域模型架构的一个很好案例&#xff0c;本篇继续分析该项目各层的职…

SOS_dp算法

Codeforces博客 简介&#xff1a; 前置知识&#xff1a;状压dp Sum over Subsets dynamic programming&#xff0c;简称Sos dp,状压dp的一种 用一个列题引出SOS dp&#xff1a; 给你一个由2N2^N2N个整数组成的确定数组A&#xff0c;我们需要计算对于任意的x&#xff0c;F(x)所…