zoukankan      html  css  js  c++  java
  • dp优化---四边形不等式与决策单调性

    四边形不等式

    定理1:

      设w(x,y)为定义在整数集合上的二元函数,若存在任意整数a,b,c,d(a<=b<=c<=d),并且w(a,d)+w(b,c)>=w(a,c)+w(b,d)都成立,则w(x,y)满足四边形不等式。

    定理2:

      设w(x,y)为定义在整数集合上的二元函数,若存在任意整数a,b(a<b),并且w(a,b+1)+w(a+1,b)>=w(a,b)+w(a+1,b+1)都成立,则w(x,y)也满足四边形不等式。

    用数学归纳法证明即可。

    决策单调性

      假设转移方程为dp[i]=min(dp[j]+v(j,i)),v(j,i)为状态j到状态i的转移代价。设p[i]为转移到i状态最优的j,如果p[i]在定义域上单调不下降则称转移方程具有决策单调性。

    定理:

      若在上述转移方程中v(j,i)满足四边形不等式,转移方程满足决策单调性。

    证明:

      

       观察式③可以发现,当j<p[i]时,以p[i]作为dp[i`]的决策比j要好,那么以此可以得出p[i`]>=p[i],既转移方程满足决策单调性

    应用

      如何通过决策单调性将o(n^2)的复杂度降到o(nlogn)呢?

      关键在于如何维护p数组,首先再回顾一下p数组的意义:p[i]是dp[i]的最优决策,既dp[i]=dp[p[i]]+v(p[i],i)最优。并且p数组单调不下降,根据单调不下降的性质可以维护一个单调队列,队列元素为(x,l,r)三元组表示p[l-r]=x。每次添加一个新决策i都要与之前的决策比较,删除p[1~i-1]的决策,维护它最优决策的性质。

      总结一下过程,对于每个i,执行下列操作:

      1.设队首为(j0,l0,r0),若r0<i,则删除队首,保证队首的决策对应dp[i]。然后再令l0++(举例:当队首为(1,2,5),而i==2时,删除p[2],因为对i+1来说p[1~i]没有意义)。

      2.计算dp[i]=dp[j0]+v(j0,i)

      3.插入新决策i(具体过程见板子)。

            q[1].x=0;q[1].l=1;q[1].r=n;t=h=1;
            for(int i=1;i<=n;i++){
                while(h<=t&&q[h].r<i)    h++;//h表示队首,删除队首 
                q[h].l++;
                dp[i]=dp[q[h].x]+val(i,q[h].x);
                int pos=1e9;
                while(h<=t&&dp[i]+val(q[t].l,i)<=dp[q[t].x]+val(q[t].l,q[t].x))
                    pos=q[t].l,t--;//当队尾决策都不如决策i好时,删去队尾 
                if(h<=t&&dp[q[t].x]+val(q[t].r,q[t].x)>dp[i]+val(q[t].r,i)){
                    int l=q[t].l,r=q[t].r,mid,p1=q[t].r+1; 
                    while(l<=r){//二分求出以i为最优决策的位置p1,p1之后i决策更优 
                        mid=l+r>>1;
                        if(dp[q[t].x]+val(mid,q[t].x)>=dp[i]+val(mid,i))
                            p1=mid,r=mid-1;
                        else
                            l=mid+1;
                    }
                    q[t].r=p1-1;pos=p1;
                }
                if(pos<=n){
                    ++t;q[t].l=pos;q[t].r=n;q[t].x=i;
                }
            }
    板子
  • 相关阅读:
    openjudge666:放苹果—题解
    欢迎来到路由器的世界!这里是开端
    Codevs1169:传纸条——题解
    POJ3498:March of the Penguins——题解
    模板:并查集
    模板:快速幂
    模板:排序(三)
    程序员之间的鄙视链
    自动化测试的成本高效果差,那么自动化测试的意义在哪呢
    自动化测试的成本高效果差,那么自动化测试的意义在哪呢
  • 原文地址:https://www.cnblogs.com/r138155/p/12673154.html
Copyright © 2011-2022 走看看