動態規劃-帶權區間問題
一、動態規劃算法的定義:
為了著手開發一個動態規劃算法,我們需要一組從初始問題導出的滿足某些基本性質的子問題。
- 只存在多項式個子問題
- 可以容易的從子問題的解計算出初始問題的解
- 在子問題中,從“最小”到“最大”存在一種自然的順序,與一個容易計算的遞推公式相聯系。這個遞推公式允許我們從某些更小的子問題的解來確定一個子問題的解。
二、帶權區間調度問題:
我們有N個需求,標記為1,2,3,......,N,每個需求指定一個開始時間si,結束時間fi ,每個需求i有一個權值vi,如果兩個需求不重疊,那麽他們是相容的。
目標:選擇一個兩兩相容的子集,使得最大。
三、動態規劃算法:
首先讓所有的需求按照結束時間非降序排序:f1
定義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)
動態規劃算法如下:
- 求出所有的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
動態規劃-帶權區間問題