遞迴和遞推 動態規劃演算法

2022-08-24 07:36:12 字數 1537 閱讀 8765

借鑑: 

動態規劃演算法:

一、演算法思想:

將待求解的問題分解成若干個子問題,並儲存子問題的解而避免計算重複的子問題,並由子問題的解得到原問題的解。

l動態規劃演算法通常用於求解具有某種最優性質的問題。

l動態規劃演算法的基本要素:最優子結構性質和重疊子問題。

1、l最優子結構性質:問題的最優解包含著它的子問題的最優解。即不管前面的策略如何,此後的決策必須是基於當前狀態(由上一次決策產生)的最優決策。

2、重疊子問題:在用遞迴演算法自頂向下解問題時,每次產生的子問題並不總是新問題,有些問題被反覆計算多次。對每個子問題只解一次,然後將其解儲存起來,以後再遇到同樣的問題時就可以直接引用,不必重新求解

二、特徵:

1. 動態規劃一般解決最值(最優,最大,最小,最長……)問題;

2. 動態規劃解決的問題一般是離散的,可以分解(劃分階段)的;

3. 動態規劃解決的問題必須包含最優子結構,即可以由(n-1)的最優推導出n的最優。

三、動態規劃演算法的4個步驟:

1. 刻畫最優解的結構特性. (一維,二維,三維陣列)    將(1,2,3,4,5.....i-1,i)狀態的值存到陣列中

2. 遞迴的定義最優解. (狀態轉移方程)

3. 以自底向上的方法來計算最優解.

4. 從計算得到的解來構造乙個最優解.

四、主要思路:

n許多求最優解的問題可以用動態規劃來解決。

n 首先要把原問題分解為若干個子問題。注意單純的遞迴往往會導致子問題被重複計算,用動態規劃的方法,子問題的解一旦求出就要被儲存,所以每個子問題只需求解一次。

n 子問題經常和原問題形式相似,有時甚至完全一樣,只不過規模從原來的n 變成了n-1,或從原來的n×m 變成了n×(m-1) ……等等。

n 找到子問題,就意味著找到了將整個問題逐漸分解的辦法。分解下去,直到最底層規模最小的的子問題可以一目了然地看出解。

n 每一層子問題的解決,會導致上一層子問題的解決,逐層向上,就會導致最終整個問題的解決。

n如果從最底層的子問題開始,自底向上地推導出乙個個子問題的解,那麼程式設計的時候就不需要寫遞迴函式。

n 用動態規劃解題時,將和子問題相關的各個變數的一組取值,稱之為乙個「狀態」。乙個「狀態」對應於乙個或多個子問題,所謂某個「狀態」下的「值」,就是這個「狀態」所對應的問題的解。 比如數字三角形,子問題就是「從位於(r,j)數字開始,到底邊路徑的最大和」。這個子問題和兩個變數r 和j 相關,那麼乙個「狀態」,就是r, j 的一組取值,即每個數字的位置就是乙個「狀態」。該「狀態」所對應的「值」,就是從該位置的數字開始,到底邊的最佳路徑上的數字之和。

n 定義出什麼是「狀態」,以及在該 「狀態」下的「值」後,就要找出不同的狀態之間如何遷移――即如何從乙個或多個「值」已知的 「狀態」,求出另乙個「狀態」的「值」。狀態的遷移可以用遞推公式表示,此遞推公式也可被稱作「狀態轉移方程」。(注意:狀態可以用什麼來表示?一般是陣列,值就是這個陣列存的數字)

n用動態規劃解題,如何尋找「子問題」,定義「狀態」,「狀態轉移方程」是什麼樣的,並沒有一定之規,需要具體問題具體分析,題目做多了就會有感覺。(難點!)

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...