動態規劃解題一般思路

2021-08-28 10:12:02 字數 860 閱讀 2215

摘自mooc的程式設計與演算法_(:з」∠)_

一. 遞迴到動規的轉換方法

遞迴函式有n個引數,就定義乙個n維的陣列,陣列的下標就是遞迴函式引數的取值範圍,陣列元素的值就是遞迴的返回值,這樣就可以從邊界值開始逐步填充陣列,相當於計算遞迴函式值的逆過程

二.動態規劃解題一般思路

1.將原問題分解成子問題

把原問題分解成子問題,子問題和原問題形式相同或類似,只不過規模變小了,子問題都能解決,原問題即能解決(數字三角形為例)

子問題的解一旦求出就會被儲存,所以每個子問題只需要計算一次

2.確定狀態

在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值稱之為狀態。乙個狀態對應乙個或多個子問題,所謂某個狀態下的值,就是這個狀態下所對應的子問題的解

3.確定一些初始狀態(邊界狀態)的值

以數字三角形為例,初始狀態就是底邊數字值

4.確定狀態轉移方程

定義出什麼是狀態,以及在該狀態下的值後,就要找出不同的狀態之間如何遷移,即如何從乙個或多個值已知的狀態,求出另乙個狀態的值。狀態的遷移可以用遞推公式表示,此遞推公式也可稱為「狀態轉移方程」

數字三角形狀態轉移方程

三.能用動規解決的問題的特點

1.問題具有最優子結構

如果該問題最優解所包含的子問題也是最優,則稱該問題具有最優子結構

2.無後效性

當前若干個狀態值一旦確定,則此過程的演變之和這若干個狀態值有關,和之前採用哪種手段或哪種路徑得到狀態無關

動態規劃解題的一般思路

遞迴到動規的一般轉化方法 遞迴函式有n個引數,就定義乙個n維的陣列,陣列的下表是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始,逐步填充陣列,相當於計算遞迴函式值的逆過程 動規解題的一般思路 1.將原問題分解為子問題 把原問題分解為若干個子問題,子問題和原問題形式相同...

動態規劃的例題以及一般思路

解題一般思路 1.利用遞迴思想設計遞迴 2.利用記憶化遞迴儲存 3.確定狀態,寫出狀態轉移方程 4.遞迴轉遞推 例題 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得 路徑,上所經過的數字之和最大。路徑,上的每一步都只能往左下或 右下走。只需要求出這個最大和即可,不必給出具體路徑。輸入n 輸出值...

樹形DP一般解題思路

注意先求下屬,再求上司。利用鏈式前向星儲存樹 p1352 沒有上司的舞會 include using namespace std const int maxn 6e3 10 int n,r maxn head maxn int cnt 邊的編號 int d maxn 統計編號節點父節點的個數 int...