遞迴 遞推 貪心 搜尋和動態規劃

2021-09-26 20:37:38 字數 1017 閱讀 7567

遞迴:函式呼叫自身,直到達到基線條件之後,再一層層的回歸到最初的問題。這是一種自頂向下的方法。

動態規劃通常是用遞推(自底向上)來實現的,但是使用備忘錄遞迴(自頂向下)也能夠實現動態規劃。例如,動態規劃:從入門到放棄

結合這篇部落格的例子來理解, 詳解動態規劃——鄒博講動態規劃

已知問題規模為n的前提a,求解乙個未知解b。(我們用an表示「問題規模為n的已知條件」)

此時,如果把問題規模降到0,即已知a0,可以得到a0->b.

如果從a0新增乙個元素,得到a1的變化過程。即a0->a1; 進而有a1->a2; a2->a3; …… ; ai->ai+1. 這就是嚴格的歸納推理,也就是我們經常使用的數學歸納法;

對於ai+1,只需要它的上乙個狀態ai即可完成整個推理過程(而不需要更前序的狀態)。我們將這一模型稱為馬爾科夫模型。對應的推理過程叫做「貪心法」。

然而,ai與ai+1往往不是互為充要條件,隨著i的增加,有價值的前提資訊越來越少,我們無法僅僅通過上乙個狀態得到下乙個狀態,因此可以採用如下方案:

; ; ;……; ->ai+1. 這種方式就是第二數學歸納法。

對於ai+1需要前面的所有前序狀態才能完成推理過程。我們將這一模型稱為高階馬爾科夫模型。對應的推理過程叫做「動態規劃法」。

乙個問題是該用遞推、貪心、搜尋還是動態規劃,完全是由這個問題本身階段間狀態的轉移方式決定的!

每個階段只有乙個狀態->遞推;

每個階段的最優狀態都是由上乙個階段的最優狀態得到的->貪心;

每個階段的最優狀態是由之前所有階段的狀態的組合得到的->搜尋;(沒有看過這方面資料)

每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到而不管之前這個狀態是如何得到的->動態規劃。

[1] 動態規劃:從入門到放棄

[2] 詳解動態規劃——鄒博講動態規劃

[3] 教你徹底學會動態規劃——入門篇

[4] 知乎 什麼是動態規劃(dynamic programming)?動態規劃的意義是什麼?

遞迴 遞推 動態規劃

問題一 已知f 1 1 f 2 1 且f n f n 1 f n 2 則f n 等於多少?解法一 遞迴 找到遞迴關係和遞迴出口 include using namespace std int n int sum int i int main 解法二 遞推 include using namespac...

遞推與遞迴,分治法 貪心 動態規劃的區別

動態規劃 dynamic programming,dp 是一種用來解決一類 最優化問題 的演算法思想。簡單來說,動態規劃將乙個 複雜的問題分解成若干個子問題,通過綜合子問題的最優解來得到原問題的最優解。需要注意的是,動態規劃會將每個求解過的子問題的解記錄下來,這樣當下一次碰到同樣的子問題時,就可以直...

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

借鑑 動態規劃演算法 一 演算法思想 將待求解的問題分解成若干個子問題,並儲存子問題的解而避免計算重複的子問題,並由子問題的解得到原問題的解。l動態規劃演算法通常用於求解具有某種最優性質的問題。l動態規劃演算法的基本要素 最優子結構性質和重疊子問題。1 l最優子結構性質 問題的最優解包含著它的子問題...