
動态規劃(Dynamic Programming,簡稱DP)是一種通過将複雜問題分解為相互重疊的子問題,并存儲子問題解以避免重複計算的優化方法。其核心思想包含以下兩方面:
從應用領域看,動态規劃廣泛應用于算法設計(如最短路徑問題)、運籌學(如資源分配)及人工智能(如強化學習策略優化)。典型案例如下:
權威文獻中,《算法導論》(Cormen等著)将動态規劃定義為“多階段決策過程的數學優化方法”,強調其對遞歸結構的系統性優化。
動态規劃(Dynamic Programming,簡稱DP)是一種用于解決複雜優化問題的算法設計方法,其核心思想是通過将問題分解為相互重疊的子問題,并利用子問題的解來高效構建整體最優解。以下是詳細解釋:
重疊子問題
問題可分解為多個重複出現的子問題。通過存儲子問題的解(稱為“記憶化”),避免重複計算,提升效率。例如斐波那契數列中,計算第5項需要第3、4項,而第4項又需要第3、2項,存在大量重複計算。
最優子結構
問題的最優解包含其子問題的最優解。例如最短路徑問題中,若A→C的最短路徑經過B,則A→B和B→C的路徑也必須是各自段的最短路徑。
定義狀态
用變量表示問題的子狀态。例如背包問題中,狀态可以是dp[i][w]
,表示前i
個物品在容量w
下的最大價值。
狀态轉移方程
描述狀态間的遞推關系。例如斐波那契數列的方程為:
$$
dp[i] = dp[i-1] + dp[i-2]
$$
初始化與邊界條件
設置初始值(如dp=0
)和終止條件(如數組越界處理)。
計算順序
通常采用自底向上的疊代(填表法)或自頂向下的遞歸+記憶化(如Python的lru_cache
)。
分治法(如歸并排序)将問題分解為互不重疊的子問題,分别求解後合并結果;而動态規劃的子問題高度重疊,需通過存儲中間結果優化效率。
def fib(n):
dp =* (n+1)
dp = 1
for i in range(2, n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
此方法将時間複雜度從遞歸的指數級O(2ⁿ)降低到線性級O(n),空間複雜度O(n)。若進一步優化,僅保留前兩個狀态,空間可降至O(1)。
挨餓比率乘法器産權比率超過運用資金的經營抽象派藝術催化熒光法大寫體字母字符鍍鋅鐵耳界切迹反應形成分成小批量複合符號高級信息管理程式行波光電管或閘浸滲即期俊棂片狀石墨析出淺浮雕起模斜度球果菌科軟金殺剛果錐蟲素上行束審判筆錄特殊扳手完全歸納法未被邀請的投标商