数据结构与算法 - 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. 是编程的方法 - 重叠子问题
      • 保证每个重叠的子问题,只会被求解一次
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章