簡單易懂動態規劃演算法

2022-08-17 05:57:12 字數 1669 閱讀 8976

什麼是動態規劃

把原問題分解成若干個相對簡單的子問題,然後逐步解決子問題從而解決複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。

基本思想

若要解出乙個相對複雜的問題,我們需要解出其子問題,再合併子問題從而得到原問題的解。

問題特徵

最優子結構:當原問題最優解包含了其子問題的最優解時,稱該問題具有最優子結構。

重疊子問題:在用遞迴演算法自頂向下解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只解一次,而後將其解儲存在乙個**中,在以後盡可能多地利用這些子問題的解。

分治與動態規劃

共同點:二者都要求原問題具有最優子結構性質,都是將原問題分而治之,分解成若干個規模較小(小到很容易解決的程式)的子問題.然後將子問題的解合併,形成原問題的解.

不同點:分治法將分解後的子問題看成相互獨立的,通過用遞迴來做。

動態規劃將分解後的子問題理解為相互間有聯絡,有重疊部分,需要記憶,通常用迭代來做。

遞迴和迭代定義

相同點:

遞迴和迭代都是迴圈的一種。

不同點:

1、程式結構不同

遞迴是重複呼叫函式自身實現迴圈。

迭代是函式內某段**實現迴圈。

2、演算法結束方式不同

遞迴迴圈中,遇到滿足終止條件的情況時逐層返回來結束。

迭代則使用計數器結束迴圈。

當然很多情況都是多種迴圈混合採用,這要根據具體需求。

3、效率不同

在迴圈的次數較大的時候,迭代的效率明顯高於遞迴。

動態規劃的解決步驟

判斷題意是否為找出乙個問題的最優解

從上往下分析問題,大問題可以分解成子問題,子問題還有更小的子問題

從下往上分析問題,找出這些問題之間的關聯(狀態轉移方程)

討論底層的邊界問題

解決問題(通常使用陣列進行迭代求出最優解)

例題:找最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba" 也是乙個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

/*

使用動態規劃

* 步驟1:找到狀態轉移函式

* 步驟2:找到底界問題兩種情況(第一種是最中間是乙個字母,第二種是最中間相鄰相同)

* 步驟3:解決問題

*/class

solution

string temp=string.valueof(s.charat(0));

//第一種

for(int i=0;i)

} else

break

; }

}//第二種

for(int i=0,j=1;i)

} else

break

; }

}return

temp;

}}

動態規劃演算法

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

動態規劃演算法

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

動態規劃演算法

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