📁
编程笔记
  • 水行云起
  • 功夫在诗外
    • 程序员必读书单
    • 朝闻道
    • Index
    • 大型网站技术架构
    • 富兰克林自传
    • 笛卡尔
    • 程序员修炼之道
    • 知行合一王阳明
    • 好好学习
    • 硅谷钢铁侠:埃隆·马斯克的冒险人生
    • 人性的弱点
    • 人类简史:从动物到上帝
  • 性能分析
    • 进程管理
    • xhprof
    • linux性能排查
  • 存储
    • MySQL
    • 数据中台
    • 深度好文
    • Redis
    • Memcache
  • 大数据
    • 海量数据处理
    • Kafka
    • [译]Hadoop、Spark和Flink-大数据框架对比
    • 数据分析
    • 深度好文
  • 设计模式
    • [译]构建无bug面向对象软件:契约式设计简介
  • 并发编程
    • [译]使用PHP修改《我的世界》——代码篇
    • 深度好文
  • 数学之美
    • [译]PHP尚不适合机器学习的三个原因
    • 分词
    • SVM
    • NLP-文本分类
    • [译]解密数据科学
  • 搬山之术
    • 正则表达式
    • 搜索技巧
    • MAC专区
  • 数据结构和算法
    • 树
    • 动态规划
    • 线性-链表
    • 排序
    • 图
  • 网络通信
    • 深度好文
  • 语言
    • PHP
    • Golang
    • Cpp
  • 操作系统
    • 深度好文
    • 操作系统课程笔记
  • 琅嬛福地
    • 前辈博客
    • 站点
    • 电子书
  • PHP笔记
    • PHP7新特性整理
  • 前端
    • [译]为什么Flutter选择Dart
    • 深度好文
Powered by GitBook
On this page
  • 定义
  • 性质
  • 适用情况
  • 实现
  • 算法
  • 参考

Was this helpful?

  1. 数据结构和算法

动态规划

定义

Dynamic programming,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。

性质

  1. 重叠子问题:它将问题重新组合成子问题,为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

  2. 最优子结构:局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。

适用情况

  1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。

  2. 无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更大的问题的求解决策影响。

  3. 子问题重叠性质。指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率,降低了时间复杂度。

实现

解题流程:

  1. 暴力的递归

  2. 带备忘的自顶向下法(记忆化搜索);

  3. 自底向上法(将子问题按规模排序,类似于递推)。

算法

  1. 最长公共子序列

  2. Floyd-Warshall算法

  3. Viterbi算法

参考

Previous树Next线性-链表

Last updated 4 years ago

Was this helpful?

动态规划-WIKI
动态规划-OI-WIKI
动态规划系列