动态规划

暴力递归

暴力递归就是尝试

  • 把问题转化为规模缩小了的同类问题的子问题
  • 有明确的不需要继续进行递归的条件(base case)
  • 有当得到了子问题的结果之后的决策过程
  • 不记录每一个子问题的解

动态规划

什么暴力递归可以继续优化?

  • 有重复调用同一个子问题的解,这种递归可以优化
  • 如果每一个子问题都是不同的解,无法优化也不用优化

暴力递归和动态规划的关系

  • 某一个暴力递归,有解的重复调用,就可以把这个暴力递归优化成动态规划
  • 任何动态规划问题,都一定对应着某一个有解的重复调用的暴力递归
  • 但不是所有的暴力递归,都一定对应着动态规划

如何找到某个问题的动态规划方式?

  1. 设计暴力递归:重要原则+4种常见尝试模型!
  2. 分析有没有重复解
  3. 用记忆化搜索 -> 用严格表结构实现动态规划
  4. 看看能否继续优化

设计原则

1. 每一个可变参数的类型,一定不要比int类型更加复杂
2. 原则1可以违反,让类型突破到一维线性结构,那必须是单一可变参数
3. 如果发现原则1被违反,但不违反原则2,只需要做到记忆化搜索即可
4. 可变参数的个数,能少则少

常见的4种尝试模型

1. 从左往右的尝试模型
2. 范围上的尝试模型
3. 多样本位置全对应的尝试模型
4. 寻找业务限制的尝试模型

如何分析有没有重复解

  • 列出调用过程,可以只列出前几层
  • 有没有重复解,一看便知

暴力递归到动态规划的套路

  1. 你已经有了一个不违反原则的暴力递归,而且的确存在解的重复调用
  2. 找到哪些参数的变化会影响返回值,对每一个列出变化范围
  3. 参数间的所有的组合数量,意味着表大小
  4. 记忆化搜索的方法就是傻缓存,非常容易得到
  5. 规定好严格表的大小,分析位置的依赖顺序,然后从基础填写到最终解
  6. 对于有枚举行为的决策过程,进一步优化

动态规划的进一步优化

  1. 空间压缩
  2. 状态化简
  3. 四边形不等式

经典题目

背包问题的动态规划解法

两个字符串的最长公共子序列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值