动态规划一直是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:点击打开链接
推荐: