ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【算法学习】动态规划的斜率优化

2021-10-18 01:05:02  阅读:157  来源: 互联网

标签:队列 决策 最小 斜率 算法 枚举 优化 dp


动态规划的状态转移方程为\(dp[i] = min(dp[j] + f(i,j)) , L(i)<=j<=R(i)\)
若\(f(i,j)\)仅与i,j中的一个有关,则可以采用单调队列优化,若\(f(i,j)\)与\(i,j\)均有关,则可以采用斜率优化
例题:
HDU3507
容易写出状态转移方程:
\(dp[i] = min(dp[j] + (s[i] - s[j])^2) + m , 0=<j<i\)
枚举一遍i,枚举一遍j的话时间复杂度是 \(n^2\)
使用斜率优化可以做到\(On\)
上面方程变换后,可看成一元线性方程y=kx+b:
\(dp[j]+s[j]^2=2s[i]*s[j]+dp[i]-s[i]^2-m\)
\(y = dp[j]+s[j]^2 , k =2s[i],x = s[j],b=dp[i]-s[i]^2-m\)

在二维坐标系考虑决策:
我们要求dp[i]最小,即b最小。 每一个决策j对应坐标系中的一个点\((s[j],dp[j]+s[j]^2)\)
将直线y=kx+b自下向上平移,第一次接触到的决策点b最小,就是最小的dp[i]

采用单调队列时需要注意两个问题:
1.处理过时决策点
枚举i ,斜率k是递增的,当前最优决策左侧的点已经过时,所以每次都将相邻两点线段斜率小于等于k的过时决策出队。这样队头就是最优决策
image

2.维护下凸壳
横坐标s[j]随着j的递增而递增,因此新的决策必然出现在下凸壳最右端。所以检查队列尾部两个点和第i个点是否下凸,若不满足,则队尾出队,直到满足,将i加入队列尾部。
image

标签:队列,决策,最小,斜率,算法,枚举,优化,dp
来源: https://www.cnblogs.com/muscletear/p/15418910.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有