动态规划
将一个规模大的问题转化为几个小的问题,通过解决小问题来得到整体的解。
其核心问题是问题的状态的定义与状态转移方程的求解。关键在于将重复出现的子问题在第一次求解之后就将其保存起来,以后再遇到时不用重复求解。是按照自底向上的方式计算
如题目求解的是最大/最小值,可行与否或者方案总数时考虑。
##一般步骤:
- 将问题分解为不同的子问题,设计状态
- 定义状态转移方程,找出初始状态
- 执行状态转移,状态转移方程的求解
- 求出问题的最终答案
例子
- 贪吃蛇游戏
- 找出最长的递增子序列
nums = [1,5,2,4,3]的递增子序列有 [1,5],[1,2],[1,2,4],[1,2,3],[1,4][1,3],[2,4,[2,3]
- 暴力枚举
- 动态规划:记录重复的子序列,后续可减少搜索次数(记忆化搜索,带备忘录的递归、递归树的剪枝)
- 斐波那契数列
- 爬楼梯