数据结构与算法 - 06 动态规划

  • 判断动态规划 - 同时满足以下条件
    • 1.是数学优化对方法 - 最优子结构
      • 一个问题的最优解,是由它对各个子问题的最优解决定的
      • 状态转移方程 f(n)
    • 2. 是编程的方法 - 重叠子问题
      • 保证每个重叠的子问题,只会被求解一次
  • 解题思路
    • 1. 找最优子结构:输入规模对半分
    • 2. 找最优子结构:每次减一个
    • 3. 找重叠子问题
  • 解决动态规划问题对两个难点
    • 1. 如何定义 f(n)
    • 2. 如何通过 f(1),f(2),... f(n-1) 推导出 f(n),即 状态转移方程
  • 求解方式
    • 递归 - 解 状态转移方程式
      • 缺点:耗费非常多的重复计算
    • 记忆化 Memoization
      • 避免重叠计算
      • 将已经计算出来的结果保存起来,下次遇到时,直接返回,节省计算时间
    • 自底向上 Bottom-Up
      • 通过状态转移方程,从最小对问题规模入手
      • 不断地增加问题规模,直到达到所要求的问题规模为止
      • 使用 记忆化 避免重复计算
  • 编码实现对两个难点
    • 1. 应当采用什么样的数据结构来保存什么样对计算结果
      • 往往是在把问题规模缩小对过程中进行
      • 不仅是为了避免重复的计算,也是推导状态转移方程的关键
    • 2. 如何利用保存下来的计算结果推导出状态转移方程
  • 动态规划分类
    • 1. 线性规划
      • 子问题的规模以线性的方式分布
      • 结果可以存储在一维线性数据结构里,如:一维数组、哈希表等
    • 2. 区间规划
      • 各个子问题的规模由不同的区间来定义
      • 结果存储在二维数组里
      • 一般用 dp[i][j] 代表从第 i 个位置到 第 j 个位置之间对最佳状态或结果
    • 3. 约束规划
      • 在上述一般解法的基础上,加入限制或约束条件
    • 一个问题的最优解,是由它对各个子问题的最优解决定的
    • 状态转移方程 f(n)
    • 2. 是编程的方法 - 重叠子问题
      • 保证每个重叠的子问题,只会被求解一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值