• 动态规划-带权区间问题


    一、动态规划算法的定义:

      为了着手开发一个动态规划算法,我们需要一组从初始问题导出的满足某些基本性质的子问题。

    1. 只存在多项式个子问题
    2. 可以容易的从子问题的解计算出初始问题的解
    3. 在子问题中,从“最小”到“最大”存在一种自然的顺序,与一个容易计算的递推公式相联系。这个递推公式允许我们从某些更小的子问题的解来确定一个子问题的解。

    二、带权区间调度问题:

      我们有N个需求,标记为1,2,3,......,N,每个需求指定一个开始时间si,结束时间fi ,每个需求i有一个权值vi,如果两个需求不重叠,那么他们是相容的。

      目标:选择一个两两相容的子集,使得最大。

    三、动态规划算法:

      首先让所有的需求按照结束时间非降序排序:f1<=f2.....<fn

      定义p(j) 为使得区间i与j不相交的最大的标记,既i是最右边的在j开始之前的区间。

      设最优解为O,则显然对每个区间都有:

      令区间{1,2,3,......,j}的最优解为OPT(j)

      则:

        OPT(j) = MAX( vj + OPT(p(j)), OPT(j-1))

      并且需求j属于OPT(j),当且仅当:

        OPT(p(j)) + vj >= OPT(j-1)

     

    动态规划算法如下:

    1. 求出所有的OPT(j)

        其中数组M用于存储OPT(j)

        M-Comupte-OPT(j)

         If j == 0 then

          Return 0

         Else if M[j] 不为空 then

          Return M[j]

         Else

          M[j] = MAX( vj + Comupte-OPT(p(j)), Comupte-OPT(j-1))

          Return M[j]

         End

        

      2. 根据上一步求出的OPT[j],求出最优解中包含的区间

       Find-Solution(j)

        If j == 0 then

          Return “”;

        Else

          If  OPT(p(j)) + vj >= OPT(j-1) then

            Return j + Find-Solution(p(j))

          Else

            Return Find-Solution(p(j))

            End

         End

     

  • 相关阅读:
    vs利用正则表达式统计代码行数
    C/C++/MFC的include搜索顺序
    afxwin.h afx.h afxver.h afxv_w32.h windows.h包含顺序
    C/C++中内存块置0的三种方法:memset,ZeroMemory,SecurZeroMemory
    关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
    vs2008工程设置里添加宏
    使用共享网卡的NAT模式配置VMware中的CentOS的上网功能
    VMware10 安装centos6.7 设置NAT模式
    《大道至简》第7,8章读书笔记
    ie11浏览器和chrome浏览器对于bgsound和background的一些区别
  • 原文地址:https://www.cnblogs.com/ordili/p/8497045.html
Copyright © 2020-2023  润新知