什麼是動態規劃
把原問題分解成若干個相對簡單的子問題,然後逐步解決子問題從而解決複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。
基本思想
若要解出乙個相對複雜的問題,我們需要解出其子問題,再合併子問題從而得到原問題的解。
問題特徵
最優子結構:當原問題最優解包含了其子問題的最優解時,稱該問題具有最優子結構。
重疊子問題:在用遞迴演算法自頂向下解問題時,每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只解一次,而後將其解儲存在乙個**中,在以後盡可能多地利用這些子問題的解。
分治與動態規劃
共同點:二者都要求原問題具有最優子結構性質,都是將原問題分而治之,分解成若干個規模較小(小到很容易解決的程式)的子問題.然後將子問題的解合併,形成原問題的解.
不同點:分治法將分解後的子問題看成相互獨立的,通過用遞迴來做。
動態規劃將分解後的子問題理解為相互間有聯絡,有重疊部分,需要記憶,通常用迭代來做。
遞迴和迭代定義
相同點:
遞迴和迭代都是迴圈的一種。
不同點:
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 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...