动态规划

筅森魡賤 提交于 2020-08-10 23:48:27
  1. 概述

    • 什么是动态规划

    # 算法导论 15 章 开篇
    Dynamic programming, like the divide-and-conquer method, solves problems by
    combining the solutions to subproblems. (“Programming” in this context refers
    to a tabular method, not to writing computer code.) 
    # 翻译
    动态规划和分治策略类似,通过将子问题的解组合起来解决整个问题。
    (这里的programming指的不是计算机的写代码,而是一种表格法,或者叫做字典法)
    
    • 观后感

    • 表格法是一种空间换时间的策略。

      将需要重复求解的子问题的解记录下来,在下一次求解的时候可以直接获取。

      消耗一定的内存来节省重复计算的时间开销。

    • 学习之后个人觉得最难的还是根据现象来分析问题,怎样构建动态规划的最优子结构。

    • 有时候问题的解法不仅仅动态规划,还有很多,可能相比下来动态规划更加的费时费力。
    • 动态规划的要素只有几个,主要在于对问题进行抽象。

  2. 动态规划要素

    • 最优子结构

      • 整个大的问题由若干个相似结构的子问题组成。
      • 也就是说动态规划是可以用递归求解的。
      • 递归那么就需要列出其递归方程和状态转换。
    • 重复子问题

      • 分析出了最优子结构,就可以选择使用怎样的额外空间来记录求过的解。
      • 一般来说是表格,也就是一个m*n的一个矩阵,二维数组。
  3. 获取最优子结构

    • 问题的最优解需要选择比较来获取。

      做选择会造成相似的子问题需要求解

    • 选择的子解不需要考虑是否为最优解,直接认为它已经最优解.

      会通过向下递归的方式求得子问题的最优解。

    • 选择了之后的子解该怎么求,怎么用空间来存放子问题的解。

    • 筛选出最优解

      • 每一个选择都会有一个解,比较所有的解,选择最优的最为子问题的最优解。
      • 每一个选择造成的子问题几乎都是类似的,如果有不同,可能需要做更多的工作。
  4. 重复子问题

    • 重复求解

      • 如果使用自上而下的求解,比如递归,那么很可能对一个问题进行重复的求解。

      • 使用一定的空间对问题进行记录,在下一次使用的时候,只需要消耗O(1)的时间就可以得到结果。

    • 空间选择

      辅助空间越少越好,一般是mn,也有1的,也有n的,等等。

      • 1的就是和最大的子数组。

      • n的就是裁剪钢管问题。

      • mn的是经常用到的。

  5. 问题转变

    • 如果不存在最优子问题,只求是否有解

    • 回溯
    • 贪心
    • 递归分治
    • 如果不存在重复子问题

    • 递归
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!