首页 > 其他分享 >斜率优化DP

斜率优化DP

时间:2024-09-07 21:35:30浏览次数:7  
标签:min 优化 sumT 斜率 任务 sumC DP

斜率优化DP

例题 任务安排

题面

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

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

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

思路

  • 裸DP

求出\(T,C\)前缀和\(sumT,sumC\),设\(F_{i,j}\)表示把前\(i\)个任务分成\(j\)批的最小费用
\(F_{i,j}=min\){\(F_{k,j-1}+(S*j+sumT_{i})*(sumC_{i}-sumC_{k})\)}
\(O(N^3)\)

  • 费用提前计算

设\(F_{i}\) 示把前\(i\)个任务分成若干批的最小费用
\(F_{i}=min\){\(F_{j}+sumT_{i}*(sumC_{i}-sumC_{j})+S*(sumC_{N}-sumC_{j})\)}
\(O(N^2)\)

  • 斜率优化DP

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


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

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

  1. 检查队头,将斜率小于\(k\)的线段去掉
  2. 状态转移,算出\(F_{i}\)
  3. 将新决策从队尾插入,并维护凸壳
    \(O(N)\)

标签:min,优化,sumT,斜率,任务,sumC,DP
From: https://www.cnblogs.com/grylls2012/p/18402192

相关文章

  • 解锁 JVM 启动参数:2C4G 服务器的优化密码
    在Java应用程序的运行过程中,JVM(JavaVirtualMachine)的启动参数起着至关重要的作用。这些参数可以用来调整JVM的行为、优化性能、进行故障排查等。今天我们将深入探讨JVM的启动参数,帮助大家更好地理解和运用它们。本文将以一台配置为2核CPU、4GB内存的服务器为例,......
  • 快速排序的深入优化探讨
    目录1.快排性能的关键的分析:1.1三路划分算法思想:1.2三路划分的快排1.3introsort的快排1.快排性能的关键的分析:决定快排性能的关键点是每次单躺排序后,key对数组的分割,如果每次选key基本二分居中,那么快排的递归树就是可均匀的满二叉树,性能最佳。但是实践中虽......
  • [Mysql]慢查询优化
    慢查询可能的原因SQL没加索引很多时候,我们的慢查询,都是因为没有加索引。如果没有加索引的话,会导致全表扫描的。因此,应考虑在where的条件列,建立索引,尽量避免全表扫描。反例:select*fromuser_infowherename='捡田螺的小男孩公众号';正例://添加索引altertableuser_......
  • 深度学习实战4--GAN进阶与优化
            GAN  的问题主要有两点:Loss 等于0的梯度消失问题和梯度不稳定以及多样性受损。前者是因为选择的分布函数使用JS距离,这个距离不能衡量两个不相交的分布的距离;后者是因为Loss  函数要求KL距离最小,JS 距离最大,所以梯度不稳定,而且 Loss 函数对正确率要......
  • 『功能项目』项目优化 - 默认管线转URP【31】
    打开上一篇30状态模式转换场景的项目,进入战斗场景本章要做的事情是将默认(普通)管线项目转成URP渲染管线后,更换场景首先在资源商店里导入一个免费的URP场景双击外包的场景资源是粉色(说明普通管线不支持URP渲染管线场景)接下来我们通过配置将默认管线项目升级到URP管线......
  • 【Leetcode:LCR 101. 分割等和子集 + 递归 + 记忆化搜索 + dp】
    ......
  • 淘宝客APP的架构设计与性能优化
    淘宝客APP的架构设计与性能优化大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!淘宝客APP作为一种电商推广工具,其架构设计和性能优化对于用户体验至关重要。本文将探讨淘宝客APP的架构设计以及如何进行性能优化。1.架构设计淘宝客APP的架构......
  • 线性dp:LeetCode516 .最长回文子序列
    LeetCode516.最长回文子序列题目叙述:力扣题目链接(opensnewwindow)给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例1:输入:s="bbbab"输出:4解释:一个可能的......
  • J.U.C Review - 计划任务ScheduledThreadPoolExecutor源码分析
    文章目录TimeVSScheduledThreadPoolExecutor小DemoScheduledThreadPoolExecutor类结构ScheduledThreadPoolExecutor主要方法介绍scheduleDelayed接口ScheduledFuture接口RunnableScheduledFuture接口ScheduledFutureTask类scheduleAtFixedRatescheduleWithFixedDelayd......
  • 使用docker-compose部署wordpress
    前期工作请参考我写的这篇文章docker-compose轻松部署jenkins1、创建项目目录[root@docker~]#mkdir-p/compose/wordpress2、yaml文件内容version:'3'services:mysql:image:mysql:5.7ports:-"3306:3306"environment:-"MYSQL_ROOT_......