动态规划一直是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
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 图+ 背包)
***********************************************************你再也看不到我了 (︶︿︶)