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

2021-08-20 07:36:33 字數 1238 閱讀 6394

動態規劃(dynamic programming)與分治方法相似,都是通過組合子問題的解來求解原問題。不同的是,分治方法通常將問題劃分為互不相交子問題遞迴地求解子問題,再講它們的解組合起來,求出原問題的解。而動態規劃應用於子問題重疊的情況,即不用的子問題具有公共的子子問題。在這種情況下,如果採用分治演算法,則分治演算法會做許多不必要的工作,它會反覆地求解那些公共子子問題。對於動態規劃法,它對每個子子問題只求解一次,將其儲存在乙個**中,從而無需每次求解乙個子子問題時都重新計算,避免了這種不必要的計算工作。

也就是說,動態規劃法與分治方法相比,是用空間來換時間,而時間上獲得的效益是很客觀的,這是一種典型的時空平衡(time-memory trade-off)的策略。通常,動態規劃法用來求解最優化問題(optimization problem),如斐波那契數列求值問題,鋼條切割問題,0-1揹包問題,矩陣鏈乘法問題,最長公共子串行(lcs)問題,最優二叉搜尋樹問題等。

一般情況下,動態規劃演算法的步驟如下:

刻畫乙個最優解的結構特徵。

遞迴地定義最優解的值。

計算最優解的值,通常採用自底向上的方法。

利用計算出的資訊構造乙個最優解。

接下來,我們將從斐波那契數列求值這個簡單的例子入手,來分析動態規劃法的具體步驟和優點。

斐波那契數列記為

,其表示式如下:⎧⎩

⎨⎪⎪f

(0)=

0f(1

)=1f

(n)=

f(n−

1)+f

(n−2

),n≥

2 // 利用遞迴方法計算斐波那契數列的第n項

public

static biginteger rec_fib(int n)

// 利用動態規劃法(dp)計算斐波那契數列的第n項

public

static biginteger dp_fib(int n)

return currentfib;}}

}輸出結果如下所示:

the fib(38) is

39088169.

cost time

is0.001s.

the fib(38) is

39088169.

cost time

is2.172s.

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

動態規劃用於求解最優化子問題的,往往是高效的而準確的。這背後的邏輯,其實就是程式設計的最基本原理 不要讓程式做重複的事情。對於乙個複雜的問題,可以分解成若干個子問題來解決,這是分治法。每個分解的子問題,得到最優解,再通過乙個方式組合這些最優解,得到全域性最優解,這是貪心法。而其實分解的子問題,往往會...

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

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

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

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