zoukankan      html  css  js  c++  java
  • 四边形不等式优化dp

    摘自百度百科:http://baike.baidu.com/link?url=Jp9yFYcnnuDrvSWgq_dbq0-kGkEDBS7jmpktp7V310DC7zxpNTM5aAQbFpi35AORkTgOz_e5woBJcaqqvZsbJg3rmc_14O6akbmNIQMEj5q59ZgT9YrdTMAcMYLaz6tt3Qndl3rOS4feKb_1M8PZHK 

    感觉挺详细的。QAQ  

    四边形不等式是一种比较常见的优化动态规划的方法

    如果对于任意的a1≤a2<b1≤b2,有m[a1,b1]+m[a2,b2]≤m[a1,b2]+m[a2,b1],那么m[i,j]满足四边形不等式。

    (其实想想这个是很正确的,如果按照四个点分别建立一个四边形的话,那么这个式子所代表的就是对角线大于等于相互对立的边,证明方法就是划分成三角形,对角线便是三角形的斜边,自然大于,对于刚好成一条直线情况,此时刚好取到等于号)

    四边形不等式用于DP优化

    设m[i,j]表示动态规划的状态量。
    m[i,j]有类似如下的状态转移方程:
    m[i,j]=min{m[i,k]+m[k,j]}(i≤k≤j)
    m满足四边形不等式是适用这种优化方法的必要条件
    对于一道具体的题目,我们首先要证明它满足这个条件,一般来说用数学归纳法证明,根据题目的不同而不同。
    通常的动态规划的复杂度是O(n^3),我们可以优化到O(n^2)
    定义s(i,j)为函数m(i,j)对应的使得m(i,j)取得最大值的k值。
    我们可以证明,s[i,j-1]≤s[i,j]≤s[i+1,j]
    那么改变状态转移方程为:
    m[i,j]=min{m[i,k]+m[k,j]}(s[i,j-1]≤k≤s[i+1,j])
    复杂度分析:不难看出,复杂度决定于s的值,以求m[i,i+L]为例,
    (s[2,L+1]-s[1,L])+(s[3,L+2]-s[2,L+1])…+(s[n-L+1,n]-s[n-L,n-1])=s[n-L+1,n]-s[1,L]≤n
    所以总复杂度是O(n)

    证明

    对s[i,j-1]≤s[i,j]≤s[i+1,j]的证明:
    设mk[i,j]=m[i,k]+m[k,j],s[i,j]=d
    对于任意k<d,有mk[i,j]≥md[i,j](这里以m[i,j]=min{m[i,k]+m[k,j]}为例,max的类似),接下来只要证明mk[i+1,j]≥md[i+1,j],那么只有当s[i+1,j]≥s[i,j]时才有可能有ms[i+1,j][i+1,j]≤md[i+1,j]
    (mk[i+1,j]-md[i+1,j])-(mk[i,j]-md[i,j])
    =(mk[i+1,j]+md[i,j])-(md[i+1,j]+mk[i,j])
    =(m[i+1,k]+m[k,j]+m[i,d]+m[d,j])-(m[i+1,d]+m[d,j]+m[i,k]+m[k,j])
    =(m[i+1,k]+m[i,d])-(m[i+1,d]+m[i,k])
    ∵m满足四边形不等式,∴对于i<i+1≤k<d有m[i+1,k]+m[i,d]≥m[i+1,d]+m[i,k]
    ∴(mk[i+1,j]-md[i+1,j])≥(mk[i,j]-md[i,j])≥0
    ∴s[i,j]≤s[i+1,j],同理可证s[i,j-1]≤s[i,j]
    证毕

    扩展

    以上所给出的状态转移方程只是一种比较一般的,其实,很多状态转移方程都满足四边形不等式优化的条件。
    解决这类问题的大概步骤是:
    1. 证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件
    2. 证明m满足四边形不等式
    3. 证明s[i,j-1]≤s[i,j]≤s[i+1,j]
  • 相关阅读:
    【JDK】JDK源码分析-Semaphore
    【JDK】JDK源码分析-CyclicBarrier
    【JDK】JDK源码分析-CountDownLatch
    【JDK】JDK源码分析-ReentrantLock
    【JDK】JDK源码分析-AbstractQueuedSynchronizer(3)
    【JDK】JDK源码分析-AbstractQueuedSynchronizer(2)
    【JDK】JDK源码分析-AbstractQueuedSynchronizer(1)
    如何判断无线和网线是否在同一网段?
    Android Studio+SVN配置生成apk文件
    Java冒泡排序
  • 原文地址:https://www.cnblogs.com/boson-is-god/p/6218821.html
Copyright © 2011-2022 走看看