轉自:算法
動態規劃的基本思想blog
動態規劃的基本思想在於發現和定義問題中的子問題,這裏子問題可也以叫作狀態;以及一個子問題到下一個子問題之間 是如何轉化的 也就是狀態轉移方程遞歸
所以咱們遇到一個問題的時候 應該想想這個問題是否能用某種方式表示成一個小問題,而且小問題具備最優子結構it
最優子結構:問題的最優解由相關子問題的最優解組合而成,這些子問題能夠獨立求解im
關於最優子結構 咱們來看2個示例img
一、求無權有向圖中q-t的最短路徑動態規劃
若是q-t間的最短路徑通過了點w 那麼咱們能夠證實 q-w w-t也均是最短路徑 co
因此無權有向圖最短路徑是具備最優子結構的ps
二、求無權有向圖中q-t的最長的路徑ab
而無權有向圖最長路徑中
q-t的最長路徑是是q-r-t 但 q-r缺不是q-r的最長路徑 q-s-t-r是一條更長的路徑
因此無權有向圖最長路徑不具備最優子結構
動態規劃與貪心等其餘算法的比較
動態規劃與分治,減治
分治 :將大問題分紅若干個小問題去解決 遞歸的求解每一個小問題,每一個小問題之間沒有關係 例如 快排
減治 :將大問題縮減成小問題,減掉的部分不須要考慮,例如:二分查找
動態規劃:將原問題分紅多個子問題,不一樣子問題間存在必定的聯繫,相互間有重疊的子問題
這裏我我的認爲動態規劃分治 減治都是將大問題拆分紅小問題 進行求解 區別在於
減治法減掉的部分 能夠不用再求解了;
分治法每一個小問題都須要進行求解;
動態規劃不一樣的子問題間是有相互重疊的子問題的
動態規劃與貪心
動態規劃在於咱們求解了全部子問題 雖然有些子問題最終並不能組成答案
而貪心算法任務無需求解全部子問題,因此選擇在當前狀況下最優的狀況自頂向下的求解問題,貪心能夠認爲是動態規劃的一個特例
若是用一個樹來表示子問題的話 能夠認爲動態規劃考慮了樹中的全部節點
而貪心算法減去了樹了許多枝幹,在考慮了通向最優解的那一條路