今天跟你們分享下算法思想中比較難的一種"動態規劃",動態規劃給人像是做戰時經常使用的「迂迴戰術」,或者說是算法
游擊戰,在運動中尋找突破口。優化
一: 思想blog
首先要了解」動態規劃「,必須先知道什麼叫作」多階段決策「,百科裏面對這個問題解釋的很全,我就load一段出來,遞歸
你們得要好好品味,好好分析。原理
上面圖中最後一句話就定義了動態規劃是要幹什麼的問題。im
二:使用規則算法複雜度
如今咱們知道動態規劃要解決啥問題了,那麼什麼狀況下咱們該使用動態規劃呢?db
① 最優化原理(最優子結構性質):img
若是一個問題的最優策略它的子問題的策略也是最優的,則稱該問題具備「最優子結構性質」。分享
② 無後效性:
當一個問題被劃分爲多個決策階段,那麼前一個階段的策略不會受到後一個階段所作出策略的影響。
③ 子問題的重疊性:
這個性質揭露了動態規劃的本質,解決冗餘問題,重複的子問題咱們能夠記錄下來供後階段決策時
直接使用,從而下降算法複雜度。
三:求解步驟
① 描述最優解模型。
② 遞歸的定義最優解,也就是構造動態規劃方程。
③ 自底向上的計算最優解。
④ 最後根據計算的最優值得出問題的最佳策略。
四:與其餘算法的差別
① 遞歸: 遞歸採用的是「由上而下」的解題策略並帶有可能的」子問題「重複調用,時間複雜度天然高。
而」動態規劃「採用」自下而上「並帶有臨時存儲器保存上一策略的最優解,空間換時間。
② 分治: 一樣二者都是將問題劃分爲不少的子問題,不一樣的是」動態規劃「中各子問題是相互聯繫的。
③ 貪心: 要注意的是貪心算法每走一步都是不可撤回的,而動態規劃是在一個問題的多種策略中尋找
最優策略,因此動態規劃中前一種策略可能會被後一種策略推翻。
五:舉例
動態規劃中,最經典最著名的例子莫過於」揹包問題「,現有:
蘋果: 1kg 12¥
梨子: 1kg 3¥
葡萄: 1kg 10¥
板栗: 1kg 25¥
現有一個揹包,只能裝3kg水果,那麼如何獲得物品價值最大化?