ACM动态规划总结(by utobe67)

 动态规划一直是ACM竞赛中的重点,也是难点(对于我这种水平),因为该算法时间效率高,代码量少,多元性强、灵活度高,主要考察思维能力、建模抽象能力。学了这么久动态规划,虽然还只是个菜菜= =,但还是想总结一下,总得给学弟学妹留下一些什么吧。                                                                                          --写作感想 2015.1.17

转载请注明出处 http://blog.csdn.net/tobewhatyouwanttobe/article/details/42805225 谢谢

       成也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:点击打开链接

         推荐:

         Codeforces Round #214 (Div. 2) C. Dima and Salad  (变形)

         poj 2184

         woj1538

         poj 1170  (带限制条件的背包)

         zoj 3164  (综合的背包  能独立做出来背包就可以毕业了)

         zoj 3769  (小优化)

        (2)区间dp 

          推荐blog1:点击打开链接

          推荐blog2:点击打开链接

                   推荐:(这些题目都是好题 大致都亲测了的 不过木有写题解 )

            poj 1141  括号
            poj 2955  括号

            hdu 4283

            zoj 3537
            zoj 3469

            CF 149 D

            hdu 2476 

            LightOJ 1295

            LightOJ 1422

            poj 1390 Blocks (经典区间dp 方块消除  黑书例题)

            zoj 3541   (思维+区间dp)

            cug oj 1479

            还有今年(2014年)北京现场赛的D题  (思维+区间dp 主要是找状态  )= =太菜 比赛时没想到

          (3)状压dp

             最常见的就是二进制压缩了,其他进制也有,还有其他的压缩方法暂时有点想不起来了,状态压缩常见的有旅行商,总之如果数据范围比较小的话都是可以考虑状压的。

             状态压缩入门ppt:点击打开链接

             poj 2411  广场铺砖  ppt上面的习题

             hdu 4804   南京现场赛的一题  其实挺简单的  当时不会

             uva 10817  

             poj 1085 Triangle War (状压+记忆化搜索)

             hdu 4568 Hunter (旅行商问题)

             hdu 4856 Tunnels (旅行商)

             hdu 3681 Prison Break (旅行商)

             hdu 1069 Monkey and Banana (两种解法 1.dp 2.记忆化搜索)
             uva 11825 Hackers' Crackdown (状压dp,子集枚举)

             poj 1185 炮兵阵地
             zoj 3777 Problem Arrangement (好状压dp)

             zoj 3802 (状压好题)

            当然状压问题最难的就是插头dp了,因为水平有限没有掌握,就不给大家列出来了,后面会推荐一些学习链接。

         (4)概率dp

            推荐blog:9974

            推荐blog:bin神

                  blog都整理的挺好的,学习他们的就够了。

            推荐:

            hdu 4586 Play the Dice 推公式比较水

            hdu 4487 Maximum Random Walk (简单概率dp)

            hdu 3853 LOOPS 简单概率dp

            hdu 4405 Aeroplane chess 简单概率dp,比较直接

            zoj 3640 Help me Escape 从后往前,比较简单

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

            九度oj 迷宫问题 (概率dp guess消元)

            hdu 4870 Rating (概率dp guess消元)

            hdu 4089 Activation 比较经典

            hdu 4418 Time travel  比较经典BFS+概率dp+高斯消元

          (5)树形dp

            学习树形dp首先肯定要对树有一些认识了,建树、基本的搜索、图论技巧肯定是要有的,树形dp是建立在树这种数据结构上的dp,如果不是出的神题的话一般状态比较好想,但是转移的时候细节不是很好处理,通过dfs维护从根到叶子或从叶子到根的状态转移,有一些树形dp和会和背包联系起来。

             hdu 4514  求树的直径

             HDU 1520  Anniversary party  (树形dp入门经典习题)

             POJ 1655 - DP 树的重心

             Hdu 2196 Computer  

             hdu 4756 Install Air Conditioning (MST+树形dp)

             POJ 1947 Rebuilding Roads
             HDU 1561   The more, The Better

             poj 2486 Apple Tree (树形dp  比较经典)

             CodeForces 219D

             POJ 1155 TELE

             zoj 3506 Cut the Tree (细节很多 )

             hdu 4035 Maze (树上的概率dp)

            推荐blog:ZeroClock (上面的一些联系背包的习题、简单的习题亲测过  都是比较好的题)

           (6)数位dp

             “在信息学竞赛中,有一类与数位有关的区间统计问题。这类问题往往具有比较浓厚的数学味道,无法暴力求解,需要在数位上进行递推等操作。”——刘聪《浅谈数位类统计问题》

             个人感觉数学有点难,所以把数位dp放在稍稍后面一点了,先推荐两个ppt

              初探数位

              浅谈数位类统计问题

             常见的写法有直接递推统计和记忆化搜索实现,后者简介易懂一些,但是我玩的不溜,因人而异习惯用哪种吧。

             推荐:

                hdu 2089 不要62 简单数位dp

                hdu 3709 Balanced Number 比较简单

                CF 401D Roman and Numbers 状压+数位dp

                hdu 4734 F(x)  简单数位dp

                hdu 4398 X mod f(x) 把模数加进状态里面

                poj 3208 Apocalypse Someday (数位dp)

                hdu 3555 

                FZU 2113

                HDU 4509  湫湫系列故事――减肥记II

                hdu 3693 Math teacher's homework 思维变换的数位dp

                CF 55D Beautiful Numbers  比较巧妙的数位dp

                hdu 4352 XHXJ's LIS 数位dp+LIS思想

                CF 258 B  Little Elephant and Elections

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

               (7)联系数学、计数dp

              数学好的感觉做acm有优势一些,数学能力也是一个人思维能力的体现,是决定学术高度的天花板,感觉金牌区一定程度上会拼数学知识吧,= =我只会一些最基础、最简单的,需要对组合数学有一些简单的认识。

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

              小白dp uva 10313 - Pay the Price (ferrari 图+ 背包)

              hdu 4055 Number String ( DP 绝对位置转化为相对位置 )

              hdu 4945 2048 (dp+组合数)

                        Codeforces Round #157 (Div. 1) C. Little Elephant and LCM (数学、dp)

          codeforces上面的题目有很多都是dp+组合的题目,看类型就知道了,可以去上面练练,我就不一一挂出来了,下面进入矩阵环节,超级推荐的 一个blog:矩阵构造方法(矩阵构造从0到1就是这么简单)

              可以练练矩阵十题

          

bnu oj 34985 Elegant String (矩阵+dp)题目地址

          zoj 2317  (矩阵+dp)  

              poj 3744 Scout YYF I (矩阵快速幂+概率dp)

             (8)杂

               数据结构和dp结合,常见的有单调队列、单调栈、RMQ、并查集、线段树等,有时候要分析问题具有的特殊性质来进行优化,常见的就是单调性,根据数据范围来优化内存。

               单调队列学习资料:点击打开链接

           hdu 3630 Crystal mine  (二维RMQ)

         hdu 3401 Trade  

                poj 3245 Sequece Partitioning 二分+单调队列优化

         poj 3419 Difference Is Beautiful (经典问题 区间最长连续不重复数 dp+二分+RMQ)

           hdu 4521 小明系列问题——小明序列 (间隔至少为d的LIS 两种解法)

                uva live 6190 Beautiful Spacing (二分+dp检验 根据特有性质优化)

           hdu 4412 Sky Soldiers (区间dp 单调性)

           AC自动机、后缀数组没有学,字符串类型的dp就不会了 sad (┬_┬)

再给几道一般的不能划分为哪个类型的几道好题。
zoj 3805
zoj 3640
zoj 3812 (dp位优化 巧妙记录路径)
hdu 4661 Message Passing(思维 dp求拓扑排序数)

            小结:差不多就这么多了吧,各个类型的都涉及到了一点,如果能认认真真刷的差不多的话,我相信你就能崭露头角了,要强调一点的就是,刷题时尽量不要看题解,必须要有自己的思考过程,不然等于白用功,思维还是没进步,如果实在不会了再卡题解,看题解也不要一下子全看了,看一点之后可以再想想,一个题做完了要有回味,为什么没有想到、哪里没有想到,这些问题都应该想一下,这样思维才能有所突破,加油,共勉。O(∩_∩)O


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

              四、渐入佳境

              哈哈,其实你被骗了,我自己都没有渐入佳境,怎么可能整理出渐入佳境的东西呢,再进一步学习的话我推荐(1)可以刷大白或其他好的书籍 - - 我读书少 (2)练codeforces和topcoder,不一定只打上面的比赛,没打过的比赛自己题玩玩,想练dp的话可以抽每套后面的dp(3)看国家集训队论文,据大神说论文是很能提高水平的,能让你的水平上一个台阶。
              概率dp论文1走进概率的世界  论文2:期望类问题解决办法
              树形dp论文多角度思考
                        数位dp上面已经给出了
              斜率优化论文:数形结合  博客:点击打开链接
                        四边形不等式优化论文:四边形不等式   博客:点击打开链接
              插头dp论文基于连通性的动态规划  (插头dp是状态压缩的升级版 很精妙 有点难)
              水平有限也就只能整理到这儿啦,如果觉得好的话可以给个赞啦O(∩_∩)O~
              文章参考了男神的动态规划总结,这里帮他打一下广告吧 Accagain

你可能感兴趣的:(动态规划)