• 斜率优化


    首先

    对于形如(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)队首,则需要在队列里二分寻找最优值。

    证毕。。。

  • 相关阅读:
    C编译: 动态连接库 (.so文件)
    C调Lua
    gcc -l参数和-L参数
    Lua和C之间的交互
    c语言 struct 的初始化
    Ubuntu下,清屏等终端常用命令
    Luci流程分析(openwrt下)
    Ubuntu下轻松安装virtualbox
    luci范例
    luci框架-LUA的一个web框架使用
  • 原文地址:https://www.cnblogs.com/dsjkafdsaf/p/11277136.html
Copyright © 2020-2023  润新知