【学习笔记】斜率优化

【学习笔记】斜率优化

[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\)负半轴无限远处有一条直线慢慢上移(截距慢慢变大),这条直线突然经过一个我们集合内的点时,它此时的截距就是最小的截距。

参考文献:

瓦努霍格木茨格兰芬多神威无敌无双超神大聚聚yyb的博客

猜你喜欢

转载自www.cnblogs.com/winlere/p/10992557.html
今日推荐