動態規劃用於求解最優化子問題的,往往是高效的而準確的。這背後的邏輯,其實就是程式設計的最基本原理——不要讓程式做重複的事情。
對於乙個複雜的問題,可以分解成若干個子問題來解決,這是分治法。每個分解的子問題,得到最優解,再通過乙個方式組合這些最優解,得到全域性最優解,這是貪心法。而其實分解的子問題,往往會有許多重複的子問題,對程式進行減枝機制地優化,這是動態規劃法。
大學課堂上,講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...