动态规划(附dp的相关习题)

动态规划是对解的最优化问题的一种途径、一种方法,而不是一种特殊的算法。动态规划往往是针对一种最优化问题的,由于各种问题的性质不同,确定最优解的条件也互不相同。因而动态规划对于不同的问题,有各具特色的解体方法,而不存在一种万能的动态规划算法,可以解决各种最优化问题。

一.多阶段决策过程的最优化问题

这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就成为多阶段决策问题。
初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

动态规划求解问题的特点

最优化原理:即子问题的局部最优解将导致整个问题的全局最优解,也就是说一个问题的最优解只取决于子问题的最优解。

无后效性原则:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势)

动态规划问题的求解步骤

1.确定状态集合
2.进行状态划分
3.求解状态转移方程

计算状态转移方程的方法

1.递推法:递推的关键是边界和计算顺序。在多数情况下,递推法的时间复杂度是:状态总数 * 每个状态的决策个数 * 决策时间。
2.记忆化搜索:当采用记忆化搜索时,不必事先确定各个状态的计算顺序,但需要记录每个状态是否已经计算过。

动态规划的相关的题目

1.线性dp

即为线性空间上的简单递推,这是最基本的dp了
1)数字三角形问题
数字三角形
摘花生
最低通行费
方格取数
牧场物语
Worm

2)最长上升子序列问题
最长上升子序列(入门题)
怪盗基德的滑翔翼
Monkey and Banana
FatMouse’s Speed
反恐训练营

3)最大子段和问题
Maximum sum
Functions again

4)其他
Tickets
Employment Planning
Milking Time
Jumping Cows
放苹果
Sonya and Problem Wihtout a Legend
Long Path

2.背包九讲

1)01背包问题(入门题)
2)完全背包问题
3)多重背包问题(+二进制优化)
4)混合背包问题
5)二维费用的背包问题
6)分组背包问题

3.状态压缩DP

用二进制数来表示集合某些状态,从而将状态简化
蒙德里安的梦想
最短Hamilton路径

4.树形DP

用树来存储与计算相关的状态,树形dp一般思维难度较小,但要习惯这一种思维方式
没有上司的舞会(入门题)
Cell Phone Network

5.记忆化搜索

How many ways

现在的题目还比较少,也不是很全,以后会慢慢加题的(一起加油把)。

感悟:说实话,现在学动态规划挺长时间了,做的题目也不少了,但是只要是遇到了稍微拐个弯的题目我还是不会。不过多少也算是有了一些进步了。刚学动态规划的时候,啥题也做不出来,就算是给我了状态转移方程我也写不出代码来。然后就开始疯狂看题,看题解。看了很多动态规划的题目,最终才理出来了一些头绪,可以做一些简单的dp问题了。
对于动态规划问题,虽然对于不同的题目,动态规划的方法也都不同,但是这些动态规划的题还是也一定的共性的:动态规划这个方法给我们提供了一个共同的出发点,我们可以从这个出发点出发去思考问题的答案,虽然终点和做题所走的道路各不相同。但动态规划给这些题提供了共同的思考出发点。
对于动态规划,我认为还是要多怼时间,多做题,多思考(要多想 )。

猜你喜欢

转载自blog.csdn.net/li_wen_zhuo/article/details/105105814