欢迎访问https://blog.csdn.net/lxt_Lucia~~
宇宙第一小仙女\(^o^)/~~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~~
本篇文章重在递推,不在总结多种dp(太多了.....慢慢学叭......毕竟我还很菜emmm....)。
在总结递推之前,先提一点基础理论问题叭~
一.描述
1.动态规划的定义:
动态规划是运筹学的一个分支,是求解决策过程的最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。在各种算法中,我认为动态规划是较难掌握好的,主要难在模型的建立。
2.动态规划算法依赖的两个性质:
(1)最优子结构:问题的最优解是由最优子问题的最优解推出的,也就是问题的最优解包含了子问题的最优解。
(2)重叠子问题:在用递归算法自顶向下解问题时,产生的子问题并非总是新问题,有些被反复计算了多次。
3.算法分析中动态规划的四个基本步骤:
(1)描述优解的结构特征。
(2)递归地定义一个最优解的值。
(3)自底向上计算一个最优解的值。
(4)从已计算的信息中构造一个最优解。
4.常用的解题步骤:
(1) 确定子问题: 在这一步重点是分析那些变量是随着问题规模的变小而变小的, 那些变量与问题的规模无关。
(2) 确定状态:根据上面找到的子问题来给你分割的子问题限定状态 。
(3) 推到出状态转移方程:这里要注意你的状态转移方程是不是满足所有的条件, 注意不要遗漏。
(4) 确定边界条件:先根据题目的限制条件来确定题目中给出的边界条件是否能直接推导出, 如果不行也可以尝试从边界条件反推(举个例子:a(n)→a(2)有递推关系, 但是a(2)→a(1)不符合上述递推关系, 我们就可以考虑用a(1)来倒推出a(2),然后将递推的终点设置为a(2))。
(5) 确定实现方式:依照个人习惯,就像是01背包的两层for循环的顺序 。
(6) 确定优化方法:很多时候你会发现走到这里步的时候你需要返回第1步重来。首先考虑降维问题(优化内存),优先队列、四边形不等式(优化时间)等等。
5.常用方法:
(1)模型匹配法:与模型相似,直接根据题目变化套用模板,如LIS、LCS、01背包、完全背包、区间模型、树状模型。
(2)三要素法:
a.阶段:要先确定阶段,如数塔问题可以先确定当前选的是第几层,每层就是一个阶段。
b.状态:确定阶段后,每个阶段中又分为许多不同的状态。
c.决策:如背包中,用1和0来标记选还是不选第i种物品。
(3)寻找规律法:从小的状态开始推,慢慢总结出规律,或者先暴力打表,以减少繁琐,有时还真的就是暴力出奇迹哈哈。
(4)增加约束条件法:对应着消除后效性。
(5)边界条件法: 很多时候在边界时,是很容易导出状态关系的地方,也可作为特殊情况带入检查,必要时增加特判。
二.区别
记得离散课上离散老师好像讲过递归和递推的区别,这里就把迭代一块说了吧。
(1) 递归:直接或间接的自身调用自身,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,先将现在要求的大问题放在原处不作处理,转而将其转化成几个小问题,在解决完小问题的基础上再回到原处来解决这个大问题,因此递归策略只需少量的程