随笔 - 46  文章 - 0  评论 - 0  阅读 - 506 

斜率优化DP

例题 任务安排

题面

n 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 N 个任务被分成若干批,每批包含相邻的若干任务。

从零时刻开始,这些任务被分批加工,第 i 个任务单独完成所需的时间为 Ti。在每批任务开始前,机器需要启动时间 S,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完成)。

每个任务的费用是它的完成时刻乘以一个费用系数 Ci。请确定一个分组方案,使得总费用最小。

思路

  • 裸DP

求出T,C前缀和sumT,sumC,设Fi,j表示把前i个任务分成j批的最小费用
Fi,j=min{Fk,j1+(Sj+sumTi)(sumCisumCk)}
O(N3)

  • 费用提前计算

Fi 示把前i个任务分成若干批的最小费用
Fi=min{Fj+sumTi(sumCisumCj)+S(sumCNsumCj)}
O(N2)

  • 斜率优化DP

对解法二进行优化,先对状态转移方程进行变形
Fi=min{Fj(S+sumTi)sumCj}+sumTisumCi+SsumCN
min函数去掉,把关于j的值FjsumCj看作纵/横变量(由于j未知,Fj,sumCj会变化),其余部分看作常数,得
Fj=(S+sumTi)sumCj+FisumTisumCiSsumCi
k=S+sumTi,b=FisumTisumCiSsumCi,则上述直线为一条以k为斜率,b为截距的直线.k已知,最小化Fi,即为最小化截距b.
所有待决策的点(sumCj,Fj)(j<i)可看作一个平面直角坐标系上的点集,观察可得有可能有贡献的点,一定形成一个下凸壳(相邻两点斜率递增)


实际上,对于一条斜率为k的直线,若某个顶点左边的线段斜率小于k,右边的线段斜率大于k,则它为决策点,如图

在本题中,每次会有一个新决策进入集合,横坐标递增,且S+sumTi递增,所以,若我们只保留斜率大于S+sumTj部分,则凸壳最左端最优
用单调队列维护凸壳,每次转移分3步:

  1. 检查队头,将斜率小于k的线段去掉
  2. 状态转移,算出Fi
  3. 将新决策从队尾插入,并维护凸壳
    O(N)
posted on   Grylls_117  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示