斜率优化

首先

对于形如(f[i]=min(f[j]+cost[j]),0<j<i)(dp)

我们可以利用维护一个变量取最小值去维护这个(dp)方程。

再者;

对于形如(f[i]=min(f[j]+cost[j]),i-k<j<i)(dp)

我们可以发现,只用维护一段序列中的最小值即可。。

这时候,由于决策具有单调性,我们可以利用单调性来维护,

只用,利用单调队列来维护区间最值即可。

可是,对于形如:

(f[i]=min(f[j]+cost[i][j]),0<j<i)

我们应该如何去维护呢???

如果延用上面的单调性去维护的话,我们会面临一个尴尬的境界,

我们发现,(cost[][])函数与(i,j)都有关。

无法利用单调性来维护。

怎么办呢。。。。

现在,让我们来请出最后最强大的方法。

斜率优化

斜率优化是对于形如(f[i]=min(f[j]+cost[i][j]),0<j<i)的方程的优化。

可以把复杂度由本来的(O(n^2))优化到(O(n))(O(nlogn))的复杂度。

决策单调性

首先,对于斜率优化的方程,先进行证明决策单调性。

对于形如,(f[i]=min(a[i]*b[j]+c[j]+d[i]))的方程,决策点一定具有单调性。

首先,(a[x],b[x],c[x],d[x])是关于(x)的函数,且(b[x])单调递增。

首先假设(k<j)(f[j]<=f[k])

即决策(j)(k)更优;

(a[i]*b[j]+c[j]+d[i]<=a[i]*b[k]+c[k]+d[i]cdots (1))

下面有一个新的待决策点(a[i+1])

(a[i+1]=a[i]-v),即(a[i])单调递减。

我们要证下列式子

(a[i+1]*b[j]+c[j]+d[i+1]<=a[i+1]*b[k]+c[k]+d[i+1])

((a[i]-v)*b[j]+c[j]+d[i+1]<=(a[i]-v)*b[k]+c[k]+d[i+1])

(a[i]*b[j]-v*b[j]+c[j]<=a[i]*b[k]+c[k]-v*b[k])

(a[i]*b[j]+c[j]-v*b[j]<=a[i]*b[k]+c[k]-v*b[k])

由于(b[])单调递增->(v>0)

我们又有((1));

所以,可证在(k<j)且决策点(j)比决策点(k)更优的情况下。

决策点(k)一定不会在有用,因此,

决策具有单调性

我们将前面的式子展开得到

(a[i]*(b[j]-b[k])<=c[k]-c[j];)

(-a[i]<=frac {c[k]-c[j]}{b[k]-b[j]})

(S(k,j)=frac {c[k]-c[j]}{b[k]-b[j]})

  1. 我们可以发现,关于对于队首,若(-a[i]<=S(Q[L],Q[L+1])),则说明决策(Q[L])比决策(Q[L+1])无用,可以(pop)掉。
  2. 对于队尾,若有(S(Q[R-1],Q[R])<S(Q[R],i)),则说明若决策点(Q[R-1])(pop)掉了后,决策点(Q[R])一定会被(pop)掉,则可以直接把(Q[R])(pop)掉。

关于何时(pop)队首,我们要考虑一下。

  1. 若斜率(a[i])单调,直接按斜率(pop)即可。。
  2. 否则,我们无法(pop)队首,则需要在队列里二分寻找最优值。

证毕。。。

原文地址:https://www.cnblogs.com/dsjkafdsaf/p/11277136.html