關鍵字: 動態規劃
動態規劃其實質上是通過開闢記錄表,記錄已求解過的結果,當再次需要求解的時候,可以直接到
那個記錄表中去查詢,從而避免重複計算子問題來達到降低時間複雜度的效果。實際上是乙個空間
換時間的演算法。動態規劃,通常可以把指數級的複雜度降低到多項式級別。
一般演算法書都會講能不能用動態規劃來求解問題,通常是判斷有沒有最有解結構,通常是通過「剪
切技術」來判斷:即證明問題的乙個最優解中,使用的子問題的解本身也必須是最優的。通常是假
設乙個子問題不是最優的,那麼找到乙個最優的子問題來替換這個子問題,那麼產生的最優解將優
於已找到的那個最優解,從而矛盾。
其實用不用動態規劃來求解問題,還有乙個關鍵是有沒有重複的子問題。這也是使用動態規劃
與貪心法的區別所在。。貪心法求解的問題也滿足最優解結構,只是它能夠在每一步都能夠「貪婪的
」選出當前唯一的最優子問題,並且當前的選擇,是不依賴以前的選擇的,通過這種「貪婪的選擇」
選到最後時,就得到了全域性的最優解了,不會產生重複的子問題。而動態規劃,在一步選擇的時候,
是通過從以前求出的若干個與本步驟相關的子問題最優解中選擇最好的那個,加上這一步的值,來構
造這一步那個子問題的最優解,而如果以前求出的若干個子問題不儲存下來,就需要重新求(通常是遞
歸所致)。動態規劃用武之地也無非是儲存這些重複的子問題而避免重新求解而達到高效的目的。
動態規劃的難點在於寫出遞推式。動態規劃的步驟其實是很固定的,而每乙個問題的遞推式如何下手
得到會因不同的問題而不同,這是個最關鍵的問題,沒有通用的方法。通常是根據題目的問題,最終要求的問題,都會
有幾個數,以兩個數m,n為例,然後讓求最優值。你就可以使用v[m][n]陣列來儲存最有解,然後把問題
替換成i,j兩個數的問題,試圖通過v[i][j]與前面求出來的解建立遞推關係。建立遞推關係後,你可以簡單
的寫出遞迴形式的程式,這個程式只需要加上一條if(v[i][j]已求出) return v[i][j];就輕鬆改稱了動
態規劃,這就是lookup的形式。當然如果已經有了遞推式,你也很容易寫出從底向上推的迭代形式。
一般的演算法書講的動態規劃都是來求解最優解的問題,或許最初是用來求解規劃問題的,而規劃必然是最
優解問題,其實大多數的問題只要存在重複的子問題都可以使用動態規劃的思路,就看你的重複的子問題
是不是多的值得使用空間來換時間這個思路了。
動態規劃小結
現在做一下動態規劃的小結 1.揹包問題 這是一類超級經典很基礎的動態規劃,好多動態規劃題目都能用揹包的方法寫出或者是揹包的變形.這些在揹包九講中說的很清楚 鏈結 這是網上我隨便找的乙個講的比較全的部落格 這些揹包問題給我的乙個啟發就是 轉換,通過一系列的操作,轉換為01揹包 揹包給我的感受 很大一部...
動態規劃小結
1.最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a12.動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度...
動態規劃小結
近期覺得動態規劃的題目一直不能夠很好的理解,自己也不能很好的掌握,因此就做了一定量的練習,使得自己能夠掌握這一類題目的思路。動態規劃在維基百科的定義為 一種在數學 管理科學 電腦科學 經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃的思想為 若要解決乙...