動態規劃(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...