遞歸到動規的通常轉換方法數組
遞歸函數有N個參數就定義N維數組,數組的下標就是參數的取值範圍,元素的值就是遞歸函數的返回值,函數
這樣就能夠從邊界值開始逐步填充數組,至關於計算遞歸函數的逆過程。spa
動規解題的通常思路blog
1.將原問題分解爲子問題遞歸
把原問題分解爲若干個子問題,子問題和原問題形式相同或者相似,只不過規模變小了,子問題都解決了,原問題即解決。變量
子問題的解一旦求出,便將其保存,全部每一個子問題只須要求解一次。方法
2.肯定狀態im
在用動規解題時,咱們每每將和子問題相關的各個變量的一組取值,稱之爲一個「狀態」。img
一個「狀態」對應一個或者多個子問題,所謂某個「狀態」下的值,就是這個「狀態」對應的子問題的解。集合
全部「狀態」的集合,構成問題的「狀態空間」。「狀態空間」的大小,與用動態規劃解決問題的時間複雜
度直接相關。 在數字三角形的例子裏,一共有N×(N+1)/2個數字,因此這個問題的狀態空間裏一共就有N×(N+1)/2個狀態。
整個問題的時間複雜度是狀態數目乘以計算每一個狀態所需時間。在數字三角形裏每一個「狀態」只須要通過一次,
且在每一個狀態上做計算所花的時間都是和N無關的常數。
3.肯定一些初始狀態(邊界狀態)的值
以「數字三角形」爲例,初始狀態就是底邊數字,值就是底邊數字值。
4. 肯定狀態轉移方程
定義出什麼是「狀態」,以及在該「狀態」下的「值」後,就要找出不一樣的狀態之間如何遷移――即如何
從一個或多個「值」已知的 「狀態」,求出另外一個「狀態」的「值」(遞推型)。狀態的遷移能夠用遞推公式表示,
此遞推公式也可被稱做「狀態轉移方程」。
數字三角形的狀態轉移方程:
能用動規解決的問題的特色
1) 問題具備最優子結構性質。若是問題的最優解所包含的 子問題的解也是最優的,咱們就稱該問題具備最優子結 構性質。
2) 無後效性。當前的若干個狀態值一旦肯定,則此後過程的演變就只和這若干個狀態的值有關,和以前是採起哪一種手段或通過哪條路徑演變到當前的這若干個狀態,沒有關係。
經典例題:
1.數字三角形
2.最長上升子序列
3.最長公共子序列
4.最佳加法表達式