「斜率优化」学习笔记

斜率优化

考虑一个转移方程\(dp_i=\min\{dp_j+(a_i-b_j)^2\}\),其中\(j \in [0,i)\)。也就是说,我们要找到一个\(j\)使得\(dp_i\)最小。

我们对这个式子进行变形,得到\(dp_j+b_j^2=2a_ib_j+dp_i-a_i^2\)。令\(k=2a_i,x=b_j,b=dp_i-a_i^2,y=dp_j+b_j^2\),这个式子就变成了\(y=kx+b\)——“一次函数”。对于每一个\(j\),其对应了一个点\((b_j,dp_j+b_j^2)\)。当前在做\(i\)的决策时,斜率是确定的,每找到一个\(j\),就确定了这条直线。我们要在众多\(j\)中找出能使\(dp_i\)最小的那个,而\(dp_i\)在这里其实对应的是截距,也就是要让截距最小。

于是问题转化为过哪个点时截距最小——应该过下凸包中的尖角。

余下的就是如何维护凸包和找尖角的问题了。当\(x\)坐标单调递增时,用一个栈就可以维护好凸包(斜率单调递增)。而找尖角则直接二分就好了。对于一类特殊的问题,若各个\(i\)的斜率是单调递增的,只需要单调扫过去就好了。

斜率优化中运用的是数形结合的线性规划思想。用几条直线,在坐标系上将要求的东西表示出来,往往非常方便。

猜你喜欢

转载自www.cnblogs.com/qixingzhi/p/11270340.html
今日推荐