動態規劃法基本思想:將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。
著名的應用例項有:求解最短路徑問題,揹包問題,專案管理,網路流優化等。
個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存好的值給出,不再進行計算。
有乙個很簡單的例子,關於斐波那契數列。
什麼是斐波那契數列?根據維基百科的解釋是這樣的,
費波那西數列(fibonacci sequence),又譯費波拿契數、斐波那契數列、費氏數列、**分割數列。
在數學上,費波那西數列是以遞迴的方法來定義:
用文字來說,就是費波那西數列由 0 和 1 開始,之後的費波那西係數就由之前的兩數相加。
寫出c語言的話,簡單就是這樣的:
int fib(intn)
當你求fib(5)的時候,簡單到最後就是好多個fib(1)和fib (0)而已。
當n=5時,fib(5)的計算過程如下:
fib(5)
fib(4) + fib(3)
(fib(3) + fib(2)) + (fib(2) + fib(1))
((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
所以很多計算過程都是重複的,這樣對於計算機來說太浪費了,所以希望避免重複的過程再次發生,好比我們寫函式一樣,就是為了更加有效率。
利用動態規劃的思想,先將計算過的值儲存下來,之後如果發現有相同步驟的時候,直接將事先儲存好的值拿出來就好。
所以鄙人是這樣寫的:
//動態規劃法
int m[10
];bool bn[10
];int fib2(int
n)
return
m[n];
}int _tmain(int argc, _tchar*ar**)
相比演算法導論給的例項,維基百科給的更加容易理解。(越來越發現自己離不開網路了)
演算法 動態規劃演算法
動態規劃法基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。著名的應用例項有 求解最短路徑問題,揹包問題,專案管理,網路流優化等。個人對動態規劃的理解,主要就是避免重複計算。就是那些曾經發生過的事情,曾經計算過的值先儲存下來,然後再次遇到相同的子問題的時候,直接用儲存...
演算法 動態規劃演算法
背 包問題 有乙個揹包,容量為 4磅 現有如下物品 物品 重量 吉他 g 1 1500 音響 s 4 3000 電腦 l 3 2000 1 要求達到的目標為裝入的揹包的總價值最大,並且重量不超出 2 要求裝入的物品不能重複 動態規劃的核心思想是把原來的問題分解成子問題進行求解,也就是分治的思想。但是...
動態規劃演算法
一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...