1. 程式人生 > >ACM動態規劃總結(by utobe67)

ACM動態規劃總結(by utobe67)

       動態規劃一直是ACM競賽中的重點,也是難點(對於我這種水平),因為該演算法時間效率高,程式碼量少,多元性強、靈活度高,主要考察思維能力、建模抽象能力。學了這麼久動態規劃,雖然還只是個菜菜= =,但還是想總結一下,總得給學弟學妹留下一些什麼吧。                                                                                          --寫作感想 2015.1.17

       成也dp,敗也dp,這是從北京回來後的感想,北京賽區就跪在一道區間dp上面了(其實去年南京也敗在一道簡單的狀壓dp上面了),個人認為處於我這種水平的人掌握好動態規劃是最重要的,因為其思維思維性最強,如果能掌握好動態規劃的話思維能力就有一個很好的提升了,學習其他的也就會容易的多,現在acm競賽也向思維型方向在發展,個人覺得這樣是好的,所以掌握好動態規劃也變得更加重要。                                          --前言

        一、認識動態規劃

       動態規劃(dynamic programming)是解決最優化問題的一種途徑、一種方法,而不是一種特殊演算法,重點是一個建模的過程,具有很強的思維性。

       基本思想:把求解的問題劃分成多個子問題,然後按順序求解各子問題,前一子問題的求解為後一子問題的求解提供了重要的資訊,後一子問題需要根據某種決策來選取前一子問題的解以便解出自身的問題,從這些子問題的解得到原問題的解。

       動態規劃的性質

       (1)最優子結構:不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡而言之,一個最優化策略的子策略總是最優的。子問題最優時母問題通過優化選擇後一定最優的情況叫做“最優子結構”。

       (2)無後效性:某階段的狀態一旦確定,則此後過程的演變不再受此前各種狀態及決策的影響,簡單的說,就是“未來與過去無關”,當前的狀態是此前歷史的一個完整總結,此前的歷史只能通過當前的狀態去影響過程未來的演變。

       (3)子問題重疊:母問題與子問題本質上是同一個問題的情況稱為“子問題重疊”。

       (4)子問題獨立:一個母問題在對子問題選擇時,當前被選擇的子問題兩兩互不影響的情況叫做“子問題獨立”。

           解決問題的一般步驟

       (1)建立模型,確認狀態
       (2)找出狀態轉移方程
       (3)找出初始條件

              >△<

其實我也不想講這些慨念性的問題,但是講講還是有必要的∪0∪

*******************************************************************華麗的分界線O(∩_∩)O

         二、初出茅廬

         最先接觸動態規劃的就是數塔問題了,當時才剛剛加入俱樂部,拿了題目不知道怎麼做,看了題解後感嘆道:還可以這樣玩?然後就是最長上升子序列、maxsum(猶記得地大那次自己想出的那個巧妙思路)、簡單揹包,揹包的入門超級推薦一篇文章:點選開啟連結,將動態規劃、01揹包的思想講的淋漓盡致,揹包的學習還有就是經典的揹包9講了:揹包9講,初步學習的學習到混合揹包就可以了,後面的等到對dp有了一定的認識之後學會好理解一點。

          這裡掛出一些入門的題目吧

          hdu 2084  數塔

          poj 2533 最長上升子序列
          hdu 1087  最大遞增和
          hdu 2602  01揹包
          hdu 1176  免費餡餅

          hdu 1003  Max Sum
          hdu 2546  貪心+揹包

          揹包的題給出一些:poj  3624、hdu 2955、hdu 1203 、 hdu 2602、hdu 1171、hdu 1864、poj 3624、poj1837  

推薦:

          poj 1088 滑雪 (記憶化搜尋實現dp)

          hdu 1078 (記憶化搜尋實現dp)

          hdu 1506(矩陣系列一  迭代法)

          hdu 1505(矩陣系列二)

          poj 1050 (最大子矩陣)

          HDU 2571 (二維揹包)

          HDU 2059  (龜兔賽跑)

          HDU 1074 (doing homework)

         動態規劃46題也值得刷一刷點選開啟連結

               小結:dp找狀態最重要,怎樣確定狀態,首先肯定要滿足前面提到的性質了,不然不是dp問題了,找狀態可以先想幾維,嘗試的時候狀態大一點也沒有關係,先保證正確性,然後慢慢逐步優化就可以了,有一個技巧就是可以根據從題目的資料範圍得知一些資訊,慢慢來吧,以後的路還長著呢!

*******************************************************************我又來啦 O(∩_∩)O

          三、嶄露頭角(名字隨意取的,大神莫見笑)

初出茅廬之後對動態規劃大致有一個瞭解了,現在就是在加深一下了,可以開始刷小白(現在長大了 變紫書了)的動態規劃的題目,刷紫書的話建議在hust上面掛個題刷,因為感覺uva好不方便,hust上連結1連結2連結3都是我們已經掛好的紫書習題(訪問密碼:wustacm),可以clone比賽自己練,個人覺得跟著一本書刷的有一定的幫助,至少可以少讀很多題意^ ^,不過uva上面的討論還是很讚的uva oj board,值得推薦。

        現在就可以進入專題(專題和小白穿插也是可以的)的學習了,開森≧▽≦

動態規劃確實是一大塊,其下劃分的種類確實挺多的,揹包、區間dp、狀壓dp、概率dp、樹形dp、數位dp、插頭dp、優化dp、和字串結合的dp... (現在感覺什麼都都帶有dp的思想了 ̄▽ ̄

(1)揹包

揹包可以深入的學習了,推薦blog:點選開啟連結

         推薦:

         poj 2184

         poj 1170  (帶限制條件的揹包)

         zoj 3164  (綜合的揹包  能獨立做出來揹包就可以畢業了)

         zoj 3769  (小優化)

        (2)區間dp 

                   推薦:(這些題目都是好題 大致都親測了的 不過木有寫題解 )

            poj 1141  括號
            poj 2955  括號

            hdu 4283

            zoj 3537
            zoj 3469

            CF 149 D

            hdu 2476 

            LightOJ 1295

            LightOJ 1422

            zoj 3541   (思維+區間dp)

            還有今年(2014年)北京現場賽的D題  (思維+區間dp 主要是找狀態  )= =太菜 比賽時沒想到

          (3)狀壓dp

最常見的就是二進位制壓縮了,其他進位制也有,還有其他的壓縮方法暫時有點想不起來了,狀態壓縮常見的有旅行商,總之如果資料範圍比較小的話都是可以考慮狀壓的。

狀態壓縮入門ppt:點選開啟連結

             poj 2411  廣場鋪磚  ppt上面的習題

             hdu 4804   南京現場賽的一題  其實挺簡單的  當時不會

poj 1085 Triangle War (狀壓+記憶化搜尋)

             hdu 4856 Tunnels (旅行商)

             poj 1185 炮兵陣地
             zoj 3777 Problem Arrangement (好狀壓dp)

             zoj 3802 (狀壓好題)

            當然狀壓問題最難的就是插頭dp了,因為水平有限沒有掌握,就不給大家列出來了,後面會推薦一些學習連結。

         (4)概率dp

            推薦blog:9974

            推薦blog:bin神

                  blog都整理的挺好的,學習他們的就夠了。

            推薦:

            概率dp就要涉及到guess消元了,我是學的bin神的

(5)樹形dp

            學習樹形dp首先肯定要對樹有一些認識了,建樹、基本的搜尋、圖論技巧肯定是要有的,樹形dp是建立在樹這種資料結構上的dp,如果不是出的神題的話一般狀態比較好想,但是轉移的時候細節不是很好處理,通過dfs維護從根到葉子或從葉子到根的狀態轉移,有一些樹形dp和會和揹包聯絡起來。

             HDU 1520  Anniversary party  (樹形dp入門經典習題)

             POJ 1655 - DP 樹的重心

             Hdu 2196 Computer  

             POJ 1947 Rebuilding Roads
             HDU 1561   The more, The Better

             CodeForces 219D

             POJ 1155TELE

             zoj 3506 Cut the Tree (細節很多 )

            推薦blog:ZeroClock (上面的一些聯絡揹包的習題、簡單的習題親測過  都是比較好的題)

(6)數位dp

             “在資訊學競賽中,有一類與數位有關的區間統計問題。這類問題往往具有比較濃厚的數學味道,無法暴力求解,需要在數位上進行遞推等操作。”——劉聰《淺談數位類統計問題》

             個人感覺數學有點難,所以把數位dp放在稍稍後面一點了,先推薦兩個ppt

              初探數位

             常見的寫法有直接遞推統計和記憶化搜尋實現,後者簡介易懂一些,但是我玩的不溜,因人而異習慣用哪種吧。

             推薦:

                hdu 3555 

                FZU 2113

                HDU 4509  湫湫系列故事――減肥記II

                CF 258 B  Little Elephant and Elections

                HDU 4507  吉哥系列故事――恨7不成妻  (有點難了)

(7)聯絡數學、計數dp

              數學好的感覺做acm有優勢一些,數學能力也是一個人思維能力的體現,是決定學術高度的天花板,感覺金牌區一定程度上會拼數學知識吧,= =我只會一些最基礎、最簡單的,需要對組合數學有一些簡單的認識。

              hdu 4489 The King’s Ups and Downs (DP+組合)

          codeforces上面的題目有很多都是dp+組合的題目,看型別就知道了,可以去上面練練,我就不一一掛出來了,下面進入矩陣環節,超級推薦的 一個blog:矩陣構造方法(矩陣構造從0到1就是這麼簡單)

              可以練練矩陣十題

          zoj 2317  (矩陣+dp)  

(8)雜

               資料結構和dp結合,常見的有單調佇列、單調棧、RMQ、並查集、線段樹等,有時候要分析問題具有的特殊性質來進行優化,常見的就是單調性,根據資料範圍來優化記憶體。

               單調佇列學習資料:點選開啟連結

hdu 3630 Crystal mine  (二維RMQ)

         poj 3419 Difference Is Beautiful (經典問題 區間最長連續不重複數 dp+二分+RMQ)

再給幾道一般的不能劃分為哪個型別的幾道好題。 zoj 3805 zoj 3640 zoj 3812 (dp位優化 巧妙記錄路徑) hdu 4661 Message Passing(思維 dp求拓撲排序數)

            小結:差不多就這麼多了吧,各個型別的都涉及到了一點,如果能認認真真刷的差不多的話,我相信你就能嶄露頭角了,要強調一點的就是,刷題時儘量不要看題解,必須要有自己的思考過程,不然等於白用功,思維還是沒進步,如果實在不會了再卡題解,看題解也不要一下子全看了,看一點之後可以再想想,一個題做完了要有回味,為什麼沒有想到、哪裡沒有想到,這些問題都應該想一下,這樣思維才能有所突破,加油,共勉。O(∩_∩)O

***********************************************************你再也看不到我了 (︶︿︶)

四、漸入佳境

哈哈,其實你被騙了,我自己都沒有漸入佳境,怎麼可能整理出漸入佳境的東西呢,再進一步學習的話我推薦(1)可以刷大白或其他好的書籍 - - 我讀書少 (2)練codeforces和topcoder,不一定只打上面的比賽,沒打過的比賽自己題玩玩,想練dp的話可以抽每套後面的dp(3)看國家集訓隊論文,據大神說論文是很能提高水平的,能讓你的水平上一個臺階。               樹形dp論文多角度思考                        數位dp上面已經給出了               斜率優化論文:數形結合  部落格:點選開啟連結               插頭dp論文基於連通性的動態規劃  (插頭dp是狀態壓縮的升級版 很精妙 有點難)               水平有限也就只能整理到這兒啦,如果覺得好的話可以給個贊啦O(∩_∩)O~               文章參考了男神的動態規劃總結,這裡幫他打一下廣告吧 Accagain

相關推薦

ACM動態規劃總結(by utobe67)

       動態規劃一直是ACM競賽中的重點,也是難點(對於我這種水平),因為該演算法時間效率高,程式碼量少,多元性強、靈活度高,主要考察思維能力、建模抽象能力。學了這麼久動態規劃,雖然還只是個菜菜= =,但還是想總結一下,總得給學弟學妹留下一些什麼吧。        

(轉載)【DP專輯】ACM動態規劃總結

動態規劃(英語:Dynamic programming,DP)是一種在數學、電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解

leetcode與資料結構---動態規劃總結(一)

這幾天一直在做leetcode上關於動態規劃方面的題目,雖然大二下的演算法設計課上較為詳細的講過動態規劃,奈何遇到新穎的題目或者稍加背景的題目立刻就原形畢露不知題目所云了。動態規劃算是較難的一個專題了,但只要找到遞推關係其最終的程式碼又相當簡便。現在把這幾天做過的題目整理總結一下,畢竟只求做

ACM動態規劃基礎篇

文章目錄 1 前言 1.1 什麼是動態規劃 1.2 什麼時候要用動態規劃 2 斐波那契數列 $Fibonacci$ 2.1 引入 2.2 定義 2.3 遞迴分治解決 $Recursion$

LeetCode-動態規劃總結(二)

最長遞增子序列 已知一個序列 {S1, S2,…,Sn},取出若干陣列成新的序列 {Si1, Si2,…, Sim},其中 i1、i2 … im 保持遞增,即新序列中各個數仍然保持原數列中的先後順序,稱新序列為原序列的一個 子序列 。 如果在子序列中,當下標 ix > iy

LeetCode-動態規劃總結(一)

動態規劃 遞迴和動態規劃都是將原問題拆成多個子問題然後求解,他們之間最本質的區別是,動態規劃儲存了子問題的解,避免重複計算。 斐波那契數列 爬樓梯 70. Climbing Stairs (Easy) 題目描述:有 N 階樓梯,每次可以上一階或者兩階,求有多少種上樓梯

動態規劃總結

一.揹包問題: 揹包的初始化相關問題: 1.最大價值且恰好裝滿:dp[0]=0 其他負無窮 2.最小价值且恰好裝滿:dp[0]=0 其他正無窮 3.不恰好裝滿:都為0 揹包模板: #include<cstdio> int main() { //W 總

動態規劃總結及題目推薦

動態規劃一直是ACM競賽中的重點,同時又是難點,因為該演算法時間效率高,程式碼量少,多元性強,主要考察思維能力、建模抽象能力、靈活度。 ***************************************************************

ACM 動態規劃(簡稱dp) 分類

動態規劃一直是ACM競賽中的重點,同時又是難點,因為該演算法時間效率高,程式碼量少,多元性強,主要考察思維能力、建模抽象能力、靈活度。 *************************************************************

ACM 動態規劃 編輯距離

很久沒有更博了..剛開學忙得飛起0..0 最近刷題發現自己有意逃避演算法題,很生氣啊自己居然潛意識逃避了... 所以今天很認真的寫個動態規劃! 雖然這是最簡單的動態規劃... TOJ 1072:編輯距離 描述 假設字串的基本操作僅為:刪除一個字元、插入一個字元和將一個字

演算法之動態規劃總結

五、動態規劃題集整理 一、動態規劃初探       1、遞推       暫且先不說動態規劃是怎麼樣一個演算法,由最簡單的遞推問題說起應該是最恰當不過得了。因為一來,遞推的思想非常淺顯,從初中開始就已經有涉及,等差數列 f[i] = f[i-1] + d( i > 0, d為公

ACM 動態規劃題集

24.Humble Numbers http://acm.hdu.edu.cn/showproblem.php?pid=1058 如果一個數是Humble Number,那麼它的2倍,3倍,5倍,7倍仍然是Humble Number 定義F[i]為第i個Humble Number F[n]=min(2*f[i

ACM(動態規劃

打包 總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kB 描述 假如你現在拿到了許多的禮物,你要把這些禮物放進袋子裡。你只有一個最多能裝下V體積物品的袋子,你不能全部放進去。因為你拿不動那麼重的東西。你估計你能拿的最大重量為G。現在你瞭解每一個物品的完美值、重量和體

揹包問題小總結 習題(動態規劃01揹包(第k優解)完全揹包,多重揹包)acm杭電HDU2639,HDU2602,HDU1114,HDU2191

1、01揹包(每種物品只有一個) 題目 有N件物品和一個容量為V的揹包。第i件物品的費用是c[i],價值是w[i]。 求解將哪些物 品裝入揹包可使價值總和最大。 基本思路 這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或不放。 用子問題定義狀態:    

動態規劃分析總結——怎樣設計和實現動態規劃算法

基於 進一步 使用 sdn 能夠 疑惑 樓梯 -1 們的 進行算法設計的時候,時常有這種體會:假設已經知道一道題目能夠用動態規劃求解,那麽非常easy找到對應的動態規劃算法並實現;動態規劃算法的難度不在於實現,而在於分析和設計—— 首先你得知道這道題目須要用動態規劃來求

HDU acm 1003 Max Sum || 動態規劃求最大子序列和詳解

line namespace num more sequence mem ould 動態規劃 ger Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot

2018年暑假ACM個人訓練題9(動態規劃)解題報告

三角形 img 背包 使用 狀態 記憶化 logs ref wid A:m段最大字段和問題https://www.cnblogs.com/yinbiao/p/9314528.htmlB:m

UVA-11584 Partitioning by Palindromes 動態規劃 回文串的最少個數

mem ons 回文串 one lse while pri ref urn 題目鏈接:https://cn.vjudge.net/problem/UVA-11584 題意 給一個字符串序列,問回文串的最少個數。 例:aaadbccb 分為aaa, d, bccb三份 n&l

UVA11584-Partitioning by Palindromes(動態規劃基礎)

字符串 思路 tle return 轉移 lower out letters urn Problem UVA11584-Partitioning by Palindromes Accept: 1326 Submit: 7151Time Limit: 3000 mSec

UVA11584-Partitioning by Palindromes(動態規劃基礎)

tput form enc rom 結束 tdi ron str 出現 Problem UVA11584-Partitioning by Palindromes Accept: 1326 Submit: 7151Time Limit: 3000 mSec Proble