动态规划
一.简介
在ACM中,动态规划是一种将一个复杂问题分为多个简单的小问题的思想。在使用动态规划时,原问题须满足重叠子问题和最优子结构这个性质。
运用动态规划思想设计的算法一般比朴素的算法高效很多。因为在计算某个状态的时候,已经被计算的子问题将不需要重复计算,而是调用之前存储下的结果。这样就减少了大量的重复计算。
动态规划思想的本质是在一个有向无环图中,求一个函数的最优值,也可以看做是一个加入了“记忆化”的搜索过程。
二.算法分类
1.基础DP ★★★
1.1 整数划分 五种
1.2 双向DP
2.链(环)式动态规划 ★★★
2.1背包问题
01背包
完全背包
多重背包
混合背包
二维费用背包
分组背包
2.2 连续序列
最大连续子序列 MCS
最长公共子序列LCS (有的会用到滚动数组)
最长上升子序列 LIS
最大连续子矩阵
首尾相连的最大字段和
最大M子段和
3. 其他较难动态规划 (常用到状态压缩)
3.1区间DP ★★
3.2概率(期望)DP ★★
3.3数位DP★
3.4树形DP★
3.5集合DP
3.6斜率DP
三.模板整理
分类中★号越多越需要整理,但注意★号越多也更需要先理解。因为比赛中遇到的往往都是原算法分类的变形,要求可以灵活地修改模板。
四.练习题集
NYOJ动态规划分类
HDUOJ 46道 见文件夹(有几道比较难,可放到最后做)
XYNUOJ 动态规划分类
五.其他
动态规划是一种用途很广的问题求解方法,它本身并不是一个特定的算法,而是一种思想,一种手段。动态规划的理论性和实践性都比较强,一方面需要理解“状态”、“状态转移”、“最优子结构”、“重叠子问题”等概念,另一方面又需要根据题目的条件灵活设计算法,可以这么说,对动态规划的掌握情况在很大程度上能直接影响一个选手的分析和建模能力。