分治演算法和動態規劃

2021-10-03 21:14:53 字數 920 閱讀 9042

分治法與動態規劃主要共同點:

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

分治法與動態規劃實現方法:

① 分治法通常利用遞迴求解.

② 動態規劃通常利用迭代法自底向上求解,但也能用具有記憶功能的遞迴法自頂向下求解.

分治法:

設跳n級台階共有f(n)種跳法。對於第一次跳躍,如果跳1級,則剩下的n-1階有f(n-1)種跳法;如果跳2級,則剩下f(n-2)種跳法。所以f(n)=f(n-1)+f(n-2)。當n=2時,f(n)=2。當n=1時,f(n)=1。

intf(

int n)

動態規劃:

由於分治法中,f(n-1)的計算中包含f(n-2),因此會產生很多重複的運算。所以從底向上開始計算可以減少運算次數。

intf(

int n)

//自底向上體現在這個迴圈裡

return g;

}

intf(

int n)

(摘自其他部落格)

在這題裡,用陣列儲存的話,因為多建立了乙個陣列,所以空間複雜度比原動態規劃方法要高。

文首說到了分治法和動態規劃的三條區別,其實如果將陣列運用在分治法里,也就相當於是變成了自頂向下的動態規劃。

比如,對於f(n)=f(n-1)+f(n-2),在計算f(n-1)的過程中,由於f(n-1)=f(n-2)+f(n-3),我們必須要求出f(n-2)的值。這時,我們將f(n-2)的值儲存在乙個陣列a的a[n-2]裡,那麼計算f(n)其實就相當於變成了f(n)=f(n-1)+a[n-2],即省去了原式子裡的**f(n-2)**重複呼叫遞迴的步驟。

分治和動態規劃

分治和動態規劃都是解決較大規模問題比較困難或者無法直接求解的場景下的策略,兩者之間有相同點,也有不同點。相同點 1 原問題需要具有最優子結構性質 2 解決思路都是將原問題分解成若干個規模較小的子問題。不同點 1 分治法要求子問題之間相互獨立,子問題的分解中不能包含公共子問題 2 動態規劃是應對子問題...

經典演算法之動態規劃 分治 和貪心

1 分治 分治 即分而治之 把乙個複雜的問題分成多個相同或相似的子問題,再把子問題分成更小的子問題 直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。適用場景 二分搜尋 歸併排序 快速排序 大整數乘法 第k小元素 最近點對 快速傅利葉變換等。2 動態規劃 動態規劃法也是把問題一層一層地...

動態規劃,貪心,分治演算法的區別

以下摘自 演算法筆記 在區別它們之前我們先明確兩個概念 1.什麼是重疊子問題?如果乙個問題可以被分解為若干子問題,並且這些子問題會重複出現,那麼就稱這個問題為重疊子問題。2.什麼是最優子結構?如果乙個問題的最優解可以由其他子問題的最優解有效的構造出來,那麼這個問題擁有最優子問題。動態規劃與分治的區別...