【基礎】一葉知秋,從揹包問題到動態規劃

如果想了解更多內容,歡迎關注我的微信公衆號:信息學競賽從入門到巔峯。

 

之前我們講解了幾種典型揹包問題的問題模型和解決方法。

其實,揹包問題只是動態規劃問題(簡稱DP)的冰山一角。動態規劃還包含衆多類型,有的問題甚至需要數據結構維護,是信息學競賽中的一個難點,更是一個重點。

今天,我們通過對揹包問題的總結,來講解一下動態規劃的基本思路。

 

首先,解決動態規劃問題的基本步驟有:設置狀態、枚舉子問題,更新答案

我們以01揹包作爲例子:

 

設置狀態

設置狀態的關鍵在於找到我們的目標和哪些自變量有關係,只要把這些自變量加入到狀態中即可。

 

在這個問題中,我們要求解最大價值,考慮如何設置狀態。

顯然,答案(即最大價值)和每一件物品是否選擇、已用揹包容量有關。那麼,狀態的設置就要和這些要素有關。

由於答案和兩個因素有關,我們很容易就能想到狀態應該是一個二維的數組,一維表示當前處理的物品,一維表示已用揹包容量。

 

枚舉子問題

子問題的枚舉要做到不重不漏

根據設置的狀態,枚舉當前解決的這個小問題要從哪些更小的問題轉移而來。

 

在01揹包的問題中,我們設置了f[i][j]表示前i個物品,佔用了j的空間所能達到的最大價值。

那麼,我們考慮,處理第 i 個物品的時候,它的子問題顯然是處理 i-1 個物品。

接着,處理佔用容量爲 j 時,它的子問題顯然是處理容量爲 j-c[i](表示選了第i個物品)和j(表示沒選第i個物品)。

我們結合以上兩個方面,可以找到處理 f[i][j] 的子問題是(f[i-1][j-c[i]])和(f[i-1][j])。

 

更新答案

在設置好狀態,並找到子問題之後,就來到了DP的重頭戲,更新答案,也就是設置動態轉移方程

在轉移的時候,我們要思考子問題與父問題之間的關係,是取max?還是相加減?還是其他操作。

 

在上述例子中,由於我們要求最大價值,那麼顯然是用兩個子問題的最大值來更新父問題。這樣就能得出轉移方程。

f[i][j] = max(f[i - 1][j], f[i - 1][j - c[i]] + w[i])

 

 

接下來,我們介紹一下動態規劃的適用範圍。

 

無後效性

無後效性是什麼意思呢?

簡單來說,就是父問題的決策不會對子問題的決策造成影響。

以01揹包爲例,無後效性是指不管第 i 個物品選或不選,都不會影響到前 i-1 個物品所做出的決策。換句話說,就是不管第i個物品選或不選,不會對f[0...(i-1)][0...V]的值產生影響。

 

局部最優與全局最優

另一個要求是局部最優解能推出全局最優解。

這句話應該很好理解。我們用f[i-1][j-c[i]]和f[i-1][j]的值來求解f[i][j]的值,這就是通過局部最優解來推算全局最優解。

這個概念也經常用於貪心算法之中,也是類似的意思。

 

在接下來的文章中,我會分不同類型再深入講解動態規劃問題,以加強大家對動態規劃問題的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章