動態規劃的思想

2021-08-01 03:01:37 字數 2031 閱讀 2557

動態規劃( dynamic programming )演算法是解決多階段決策過程最優化問題的一種常用方法,難度比較大,技巧性也很強。利用動態規劃演算法,可以優雅而高效地解決很多貪婪演算法或分治演算法不能解決的問題。動態規劃演算法的基本思想是:將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解;對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來,讓以後再次遇到時直接引用答案,不必重新求解。動態規劃演算法將問題的解決方案視為一系列決策的結果,與貪婪演算法不同的是,在貪婪演算法中,每採用一次貪婪準則,便做出乙個不可撤回的決策;而在動態規劃演算法中,還要考察每個最優決策序列中是否包含乙個最優決策子串行,即問題是否具有最優子結構性質。

動態規劃演算法的有效性依賴於待求解問題本身具有的兩個重要性質:最優子結構性質和子問題重疊性質。

1 、最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。

2 、子問題重疊性質。子問題重疊性質是指在用遞迴演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重複計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只計算一次,然後將其計算結果儲存在乙個**中,當再次需要計算已經計算過的子問題時,只是在**中簡 單地檢視一下結果,從而獲得較高的解題效率。

當我們已經確定待解決的問題需要用動態規劃演算法求解時,通常可以按照以下步驟設計動態規劃演算法:

1 、分析問題的最優解,找出最優解的性質,並刻畫其結構特徵;

2 、遞迴地定義最優值;

3 、採用自底向上的方式計算問題的最優值;

4 、根據計算最優值時得到的資訊,構造最優解。

1 ~ 3 步是動態規劃演算法解決問題的基本步驟,在只需要計算最優值的問題中,完成這三個基本步驟就可以了。如果問題需要構造最優解,還要執行第 4 步; 此時,在第 3 步通常需要記錄更多的資訊,以便在步驟 4 中,有足夠的資訊快速地構造出最優解。

動態規劃其實質上是通過開闢記錄表,記錄已求解過的結果,當再次需要求解的時候,可以直接到那個記錄表中去查詢,從而避免重複計算子問題來達到降低時間複雜度的效果。實際上是乙個空間換時間的演算法。動態規劃,通常可以把指數級的複雜度降低到多項式級別。一般演算法書都會講能不能用動態規劃來求解問題,通常是判斷有沒有最有解結構,通常是通過「剪下技術」來判斷:即證明問題的乙個最優解中,使用的子問題的解本身也必須是最優的。通常是假設乙個子問題不是最優的,那麼找到乙個最優的子問題來替換這個子問題,那麼產生的最優解將優於已找到的那個最優解,從而矛盾。

其實用不用動態規劃來求解問題,還有乙個關鍵是有沒有重複的子問題。這也是使用動態規劃與貪心法的區別所在。貪心法求解的問題也滿足最優解結構,只是它能夠在每一步都能夠「貪婪的」選出當前唯一的最優子問題,並且當前的選擇,是不依賴以前的選擇的,通過這種「貪婪的選擇」選到最後時,就得到了全域性的最優解了,不會產生重複的子問題。而動態規劃,在一步選擇的時候,是通過從以前求出的若干個與本步驟相關的子問題最優解中選擇最好的那個,加上這一步的值,來構

造這一步那個子問題的最優解,而如果以前求出的若干個子問題不儲存下來,就需要重新求(通常是遞迴所致)。動態規劃用武之地也無非是儲存這些重複的子問題而避免重新求解而達到高效的目的。

動態規劃的難點在於寫出遞推式。動態規劃的步驟其實是很固定的,而每乙個問題的遞推式如何下手得到會因不同的問題而不同,這是個最關鍵的問題,沒有通用的方法。通常是根據題目的問題,最終要求的問題,都會有幾個數,以兩個數m,n為例,然後讓求最優值。你就可以使用v[m][n]陣列來儲存最有解,然後把問題替換成i,j兩個數的問題,試圖通過v[i][j]與前面求出來的解建立遞推關係。建立遞推關係後,你可以簡單的寫出遞迴形式的程式,這個程式只需要加上一條if(v[i][j]已求出) return v[i][j];就輕鬆改稱了動態規劃,這就是lookup的形式。當然如果已經有了遞推式,你也很容易寫出從底向上推的迭代形式。

一般的演算法書講的動態規劃都是來求解最優解的問題,或許最初是用來求解規劃問題的,而規劃必然是最優解問題,其實大多數的問題只要存在重複的子問題都可以使用動態規劃的思路,就看你的重複的子問題是不是多的值得使用空間來換時間這個思路了。

動態規劃 思想

動態規劃 把問題劃分成子問題遞迴求解,並且保留中間結果以避免重複計算子問題的方法,叫動態規劃。eg 三角形路徑數字之和 關鍵思想 1,劃分成若干子問題 2,子問題的狀態,及若干狀態值 狀態的表述。3,子狀態之間的轉換 即遞迴求解,子狀態到上一級子狀態之間的變換關係 即如何從乙個或多個值已知的狀態,求...

動態規劃思想

1 解決問題 分治 用有限的計算能力處理大規模問題的基本手段 1.1 遞迴 問題的解決方法包含遞迴部分和非遞迴部分,非遞迴部分解決問題的一部分,減少問題規模,而遞迴部分將形式不變,但減小了規模的問題傳遞到下一輪解決中去。這樣,每一輪處理,問題都有一部分 規模 得到解決,一直遞迴下去 直到終止條件 直...

簡單的動態規劃思想

原題 題解 這道題完全不需要貪心。引理 1 紙牌一定可以分到一樣多。題目條件 2 相鄰兩堆牌間最多隻會移動紙牌一次。最優方案 每次移動可以看作相鄰兩堆中左邊一堆i往右邊一堆i 1移動x張 1 x 0 左往右移動1次 2 x 0 右往左移動1次 3 x 0 不移動。當且僅當此時牌堆1 i總牌數為i 總...