從今天起,cgg會給大家講一講動態規劃。我很菜,所以這系列文章如果能在你感到迷惑的時候,給你一點你認為比較有幫助的提示,我也就滿足了。
好,下面我們步入正題,我們就從最基礎的看起。
我第一次聽到這個高大上的名詞時,我有種不明覺厲的感覺,並且聽得迷迷糊糊,勉強明白是個啥玩意兒。
當時的我就感覺這個東西好厲害,但是不怎麼會用。
我真正地會用大概是在我後來自己自學的時候才明白的。那麼,究竟什麼是動態規劃呢?
它並不是乙個演算法,而是一種解決問題的方法或者說是思想。
我們來看乙個簡單的例子。
數字三角形?
不不不,我才不舉這個老土的例子,雖然它是個好例子。
我們來看撲克牌,加入我們手上有這樣幾張牌:
一張小王
一張a一張k
一張q兩張j
一張10
我們的問題是最少幾次能將我們的牌走完,不考慮他人怎麼出牌。
我們也許可以採用列舉,比如我們可以先出一張10,再出兩張j;還可以先出兩張j,再出一張10.
有什麼問題?我們的這兩種走法得到的剩下的牌是一樣的,也就是說接下來我們需要的是剩下的牌需要多少次才能走完,但是很明顯,我們在列舉的時候,就會把這一樣的情況列舉兩遍,這還算少的,如果我們再加上一張q進行討論呢?
那麼很明顯,計算重複問題的時間就是被浪費的時間,這也是拖慢我們程式速度的問題所在。
那麼我們應該怎麼去做呢?
我們可以用一些特定的方式去描述每一種可能出現的手牌情況,然後建立乙個陣列去儲存每一種情況下的最優解,這樣的話,再次求到同樣的問題,我們可以直接把儲存的最優解返回。
這就是動態規劃的乙個應用。
那麼 我們什麼時候能用動態規劃呢?
首先這個問題必須有最優子結構。
什麼是最優子結構?
其實很好理解,最優子結構就是指,對於乙個最優策略,其子策略也一定是採取當前策略下的最優策略。
有點繞?
換句話說吧,對於撲克牌問題,假如最優策略的第一步是走一張10(雖然這顯然不是最優的,我們只是假設),那麼對於剩下的牌的走法,我們的最優策略所包括的一定是所有走法裡最優的,如果不是,那麼我們當前的最優策略就不是最優策略。
除了最優子結構,我們的問題還需要具有無後效性。
什麼又是無後效性?
這個更好解釋。
就是對於同乙個狀態,無論它的前乙個狀態是怎樣的,都不會影響到當前的決策。
更直白地說,就是我們對於一種狀態的決策只與當前的狀態相關。
比如撲克牌問題,我們無論前面怎麼走,只要我們剩下的手牌是一樣的,那麼解決眼前問題的方法與我們以前是怎樣出牌的並沒有關係。
最後我們還需要子問題重疊性。
這是我們是使用動態規劃的原因,正是需要重複計算子問題,我們才想到用動態規劃去解決問題。
所以說,如果乙個問題沒有重疊的子問題,那麼我們完全沒有必要去使用動態規劃。
這就是使用動態規劃的條件!
今天就講到這吧,自己簡單消化一下。
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
mysql動態規劃 動態規劃
動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...
《動態規劃》 ACM 動態規劃例題詳解
描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...