【学习笔记】斜率优化
[SDOI2012]任务安排
斜率优化入门题:
设\(f(x)\)为\(F(x)\)的后缀和,\(t(x)\)为\(T(x)\)的前缀和。\(dp(i)\)表示完成到第\(i\)任务的最小代价,转移:
\(dp(i)=\min \{dp(j) +f(j+1)\times(S+t(i)-t(j)) \}\)
拆掉:
- 和\(j\)无关: 没有
- 只和\(j\)相关:\(dp(j)+f(j+1)\times(S-t(j))\)
- 和\(i,j\)相关:\(f(j+1)\times t(i)\)
我们发现只和\(j\)相关的可以直接预处理,现在的问题是确定了\(i\)如何快速找到一个\(j\)
令\(y_j=dp(j)+f(j+1)\times(S-t(j))\),\(x_j=f(j+1)\),原式可以写成:
\[
dp(i)= y_j+x_jt(i)
\]
转换一下式子
\[
y_j=-t(i)x_j+dp(i)
\]
现在问题就变成了确定了一个\(i\),要快速查询前面的一个\(j\)使得\(dp(i)\)最小
把这个东西看成一条直线,就变成了我有一条在平面上平移的斜率为\(-t(i)\)的直线,现在要找一个点\((x_j,y_j)\)使得过这个点的斜率为\(-t(i)\)的直线的截距尽量小。
蓝线:斜率为\(-t(i)\)的线
紫点:\((x_j,y_j)\)
很明显,可以看做有一条在\(y\)负半轴无限远处有一条直线慢慢上移(截距慢慢变大),这条直线突然经过一个我们集合内的点时,它此时的截距就是最小的截距。
参考文献:
标签:截距,直线,最小,笔记,times,斜率,优化,dp 来源: https://www.cnblogs.com/winlere/p/10992557.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。