演算法 動態規劃法 斐波那契數列

2021-07-17 00:22:16 字數 1125 閱讀 4649

動態規劃用於求解最優化子問題的,往往是高效的而準確的。這背後的邏輯,其實就是程式設計的最基本原理——不要讓程式做重複的事情

對於乙個複雜的問題,可以分解成若干個子問題來解決,這是分治法。每個分解的子問題,得到最優解,再通過乙個方式組合這些最優解,得到全域性最優解,這是貪心法。而其實分解的子問題,往往會有許多重複的子問題,對程式進行減枝機制地優化,這是動態規劃法

大學課堂上,講c語言課程的老師,一定講過斐波那契數列

通俗的話講,這個數列中的第2項(從零開始計數)之後的每一項,是前兩項之和。基礎項,也就是第0項是0,第1項是1,以此類推得出的乙個數列:

0,1,1,2,3,5,8,13,21…

樸素演算法的實現是:

def

fib(n):

if n == 0:

return

0if n == 1:

return

1return fib(n-1) + (n-2)

這個遞迴演算法有大量的重複步驟,例如:fib(3) = fib(2) + fib(1), fib(4) = fib(3)+fib(2)。這兩個步驟中fib(2)就是被重複計算了,這樣的演算法固然正確,但是效率太對。資料量增大,演算法的時間複雜度也是指數級增大。

為了避免重複的計算操作,可以將分解的子問題的解,用乙個字典存起來。每次判斷如果字典中已經有了計算過得值,則不再進行計算,直接取值就可以了。這樣便大大減少了演算法的計算量,下面是我用python的實現:

d = {}

deffib

(n):

if(n==0):

d[n] = 0

return

0if(n==1):

d[n]=1

return1if

not d.has_key(n) :

d[n] = fib(n-1) + fib(n-2)

return d[n]

斐波那契數(動態規劃法)

1.遞迴方法 斐波那契數 include using namespace std int f 1000 long long fib int n int main int argc,char argv 2.自頂向下帶備忘的動態規劃法 動態規劃法 自頂向下帶備忘 斐波那契數 include using ...

動態規劃法(一)從斐波那契數列談起

動態規劃 dynamic programming 與分治方法相似,都是通過組合子問題的解來求解原問題。不同的是,分治方法通常將問題劃分為互不相交的子問題,遞迴地求解子問題,再講它們的解組合起來,求出原問題的解。而動態規劃應用於子問題重疊的情況,即不用的子問題具有公共的子子問題。在這種情況下,如果採用...

斐波那契數 動態規劃法和分治法

這個學期開了一門叫演算法的課,為了今天的 複賽,這兩天研究了一下這門課。感覺演算法真的是太神奇了。就比如說今天學了動態規劃 小小的入門 用它實現了斐波那契數,和原來的用分治法的一比較,差距出來了。相差十幾幾萬倍 要算的數越大相差的倍數越多 下面是實現 include include using na...