banner
Rick Sanchez

Rick Sanchez

OS && DB 爱好者,深度学习炼丹师,蒟蒻退役Acmer,二刺螈。

動態規劃的本質

FjnPxuTVsAAWXIJ

動態規劃的核心:狀態的定義和狀態轉移方程的定義

至於其他老生常談的重疊子問題、無後效性、最優子結構都是圍繞這兩個核心內容來的。

上述的狀態轉移方程中,等式右邊不會用到下標大於左邊
ii 或者 kk 的值,這是「無後效性」的通俗上的數學定義,符合這種定義的狀態定義,我們可以說它具有「最優子結構」的性質,在動態規劃中我們要做的,就是找到這種「最優子結構」。

在對狀態和狀態轉移方程的定義過程中,滿足「最優子結構」是一個隱含的條件(否則根本定義不出來)。

需要注意的是,一個問題可能有多種不同的狀態定義和狀態轉移方程定義,存在一個有後效性的定義,不代表該問題不適用動態規劃。這也是其他幾個答案中出現的邏輯誤區:
動態規劃方法要尋找符合「最優子結構」的狀態和狀態轉移方程的定義,在找到之後,這個問題就可以以「記憶化地求解遞推式」的方法來解決。而尋找到的定義,才是動態規劃的本質。

每個階段只有一個狀態 -> 遞推;
每個階段的最優狀態都是由上一個階段的最優狀態得到的 -> 貪心;
每個階段的最優狀態是由之前所有階段的狀態的組合得到的 -> 搜索;
每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到而不管之前這個狀態是如何得到的 -> 動態規劃。

每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到這個性質叫做最優子結構;
而不管之前這個狀態是如何得到的,這個性質叫做無後效性。

另: 其實動態規劃中的最優狀態的說法容易產生誤導,以為只需要計算最優狀態就好,LIS 問題確實如此,轉移時只用了每個階段「選」的狀態。但實際上有的問題往往需要對每個階段的所有狀態都算出一個最優值,然後根據這些最優值再來找最優狀態。比如背包問題就需要對前 ii 個包(階段)容量為 jj 時(狀態)計算出最大價值。然後在最後一個階段中的所有狀態中找到最優值。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。