1. 程式人生 > >動態規劃-帶權區間問題

動態規劃-帶權區間問題

分享圖片 目標 fin body alt 最優 所有 最小 開始

一、動態規劃算法的定義:

  為了著手開發一個動態規劃算法,我們需要一組從初始問題導出的滿足某些基本性質的子問題。

  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

動態規劃-帶權區間問題