数据结构与算法-动态规划-斜率优化

斜率优化dp

斜率优化动态规划(DP)是一种用于优化动态规划算法的高级技巧,主要用于加速特定类型动态规划问题的状态转移过程,

基本概念

动态规划:将复杂问题分解为子问题,通过求解子问题并保存结果来避免重复计算,从而解决原问题的算法策略。例如,斐波那契数列可以用动态规划求解,定义 (dp[n]=dp[n - 1]+dp[n - 2]) ,并保存 (dp[i]) 的值以避免重复计算。

斜率优化:在动态规划状态转移过程中,利用斜率的性质来快速确定最优决策点,从而减少状态转移的时间复杂度。它通常适用于状态转移方程具有特定形式的动态规划问题。

适用场景

状态转移方程具有凸性或凹性:当动态规划的状态转移方程满足一定的凸性或凹性条件时,斜率优化往往可以发挥作用。例如,状态转移方程形如 (dp[i]=min_{0<= j < i}{dp[j]+cost(j, i)}) ,其中 (cost(j, i)) 是从状态 (j) 转移到状态 (i) 的代价,且 (cost(j, i)) 关于 (j) 和 (i) 的某种函数关系呈现凸性或凹性。

决策单调性:即随着状态 (i) 的增大,最优决策点 (j) 单调变化。例如,若对于 (i_1 < i_2) ,状态 (i_1) 的最优决策点为 (j_1) ,状态 (i_2) 的最优决策点为 (j_2) ,则 (j_1<= j_2) (或 (j_1geq j_2) )。

优化原理

对于满足上述条件的动态规划问题,通过将状态转移方程进行变形,可以将其转化为与斜率相关的表达式。在平面直角坐标系中,每个状态 (j) 可以看作一个点 ((x_j, y_j)) ,其中 (x_j) 和 (y_j) 是根据状态转移方程和问题特性定义的坐标。通过分析不同点之间连线的斜率与最优决策点的关系,利用单调队列等数据结构维护这些点,使得在寻找最优决策点时可以通过比较斜率快速确定,从而避免对所有可能决策点的遍历,将状态转移的时间复杂度从 (O(n)) 降低到接近 (O(1)) 。

实现步骤

1. 确定状态和状态转移方程:根据问题定义动态规划的状态 (dp[i]) ,并写出状态转移方程,例如 (dp[i]=min_{0<= j < i}{dp[j]+cost(j, i)}) 。

2. 变形状态转移方程:将状态转移方程变形为可以用斜率表示的形式。假设 (dp[i]) 的状态转移方程经过变形后为 (y_i = a_i x_j + b_j + c_i) (其中 (a_i) 、 (c_i) 只与 (i) 有关, (b_j) 只与 (j) 有关),那么不同决策点 (j_1) 和 (j_2) 对应的直线斜率 (k={b_{j_1}-b_{j_2}}/{x_{j_1}-x_{j_2}}) 。

3. 维护单调队列:使用单调队列维护决策点(即点 ((x_j, y_j)) )。新点入队时,根据斜率的单调性,将队尾不满足条件的点出队,保持队列的单调性。同时,当状态 (i) 变化时,可能需要从队首移除不再是最优决策点的点。

 4. 确定最优决策点:根据状态转移方程变形后的斜率关系,从单调队列的队首获取当前状态 (i) 的最优决策点 (j) ,用于计算 (dp[i]) 。

5. 计算最终结果:按照动态规划的流程,依次计算出所有状态的 (dp) 值,最终得到问题的解。

示例

问题:给定一个序列 (a_1, a_2, ....., a_n) ,要求将其分成若干段,每段的代价为该段元素和的平方,求使得总代价最小的分段方案。

状态定义:设 (dp[i]) 表示将前 (i) 个元素进行分段的最小总代价。

状态转移方程: (dp[i]=min_{<=j < i}{dp[j]+(sum_{k = j + 1}^{i}a_k)^2}) 。令 (s[i]) 为序列的前缀和,即 (s[i]=sum_{k = 1}^{i}a_k) ,则状态转移方程可化为 (dp[i]=min_{0<= j < i}{dp[j]+(s[i]-s[j])^2}) 。

变形状态转移方程:展开 ((s[i]-s[j])^2) 得到 (dp[i]=min_{0<= j < i}{dp[j]+s[i]^2 - 2s[i]s[j]+s[j]^2}) 。设 (x_j = s[j]) , (y_j = dp[j]+s[j]^2) ,则 (dp[i]=s[i]^2 - 2s[i]x_j + y_j) ,这是一个关于 (x_j) 和 (y_j) 的线性表达式,不同决策点 (j) 对应的直线斜率 (k={y_{j_1}-y_{j_2}}/{x_{j_1}-x_{j_2}}) 。

维护单调队列:维护一个下凸壳(根据斜率性质)的单调队列,新的决策点 (j) 对应的点 ((x_j, y_j)) 入队时,通过比较斜率将队尾不满足下凸壳性质的点出队。

确定最优决策点:对于状态 (i) ,从单调队列的队首获取最优决策点 (j) ,计算 (dp[i]) 。

计算结果:计算出 (dp[n]) 即为将整个序列分段的最小总代价。

习题(任务安排1):

分析:

这是一道关于任务分组以最小化总费用的优化问题,核心在于在任务顺序固定的前提下,合

理划分任务批次,综合考虑任务执行时间、启动时间和费用系数来降低总费用

任务相关信息:有  个任务按顺序排列,执行第  个任务所需时间为  ,每个任务有对应的费

用系数  ,任务顺序不可改变。

分组与时间规则:机器将任务分成若干批,每批包含连续的若干任务。每批任务开始前机器

有启动时间  ,一批任务的执行时间是启动时间  加上该批内每个任务所需时间之和。同一批

任务在同一时刻完成,任务执行后在机器中等待直至该批任务全部执行完毕。

费用计算方式:每个任务的费用是其完成时刻乘以费用系数  。

任务目标:为机器规划分组方案,使总费用最小。

下面的图假设了s是1

伪代码1:

接下来思考如何去优化

习题2(进一步优化):

伪代码2:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值