動態規劃解題的一般思路

2021-08-15 15:48:25 字數 1293 閱讀 3384

遞迴到動規的一般轉化方法

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

動規解題的一般思路

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

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

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

2.確定狀態

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

所有「狀態」的集合,構成問題的「狀態空間」。「狀態空間」的大小,與用動態規劃解決問題的時間複雜度直接相關。在數字三角形的例子裡,一共有n*(n+1)個狀態。

整個問題的時間複雜度是狀態數目乘以計算每個狀態所需要的時間。

用動態規劃解題,經常碰到的情況是,k個整型變數能構成乙個狀態(如數字三角形中的行號和列號這兩個變數構成「狀態」)如果這k個整型變數的取值範圍分別是n1,n2,...nk,那麼,我們就可以用乙個k維的陣列array[n1][n2]...[nk]來儲存各個狀態的「值」。這個「值」未必就是乙個整數或浮點數,可能是需要乙個結構才能表示的,那麼arrry就可以是乙個結構陣列。乙個「狀態」下的「值」通常會是乙個或多個子問題的解。

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

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

4. 確定狀態轉移方程

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

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

1)問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,那麼我就稱該問題具有最優子結構性質。

2)無後效性。當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干個狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的若干個狀態,沒有關係

中國大學mooc 程式設計與演算法(二) 北京大學 郭煒

動態規劃解題一般思路

摘自mooc的程式設計與演算法 一.遞迴到動規的轉換方法 遞迴函式有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...