📜  数据结构-动态编程

📅  最后修改于: 2021-01-11 06:39:43             🧑  作者: Mango


动态编程方法类似于将问题分解为越来越小的可能的子问题的“分而治之”的方法。但是与分而治之不同,这些子问题并不是独立解决的。相反,这些较小的子问题的结果将被记住并用于相似或重叠的子问题。

在有问题的地方使用动态编程,可以将其划分为相似的子问题,以便其结果可以重复使用。通常,这些算法用于优化。在解决现有子问题之前,动态算法将尝试检查先前解决的子问题的结果。子问题的解决方案组合在一起以实现最佳解决方案。

所以我们可以说-

  • 该问题应能够分为较小的重叠子问题。

  • 通过使用较小的子问题的最佳解决方案,可以实现最佳解决方案。

  • 动态算法使用记忆化。

比较方式

与解决局部优化的贪婪算法相反,动态算法是针对问题的整体优化的动力。

与将解决方案结合起来以实现整体解决方案的分而治之算法相反,动态算法使用较小子问题的输出,然后尝试优化较大子问题。动态算法使用“记忆化”功能来记住已解决的子问题的输出。

使用动态编程方法可以解决以下计算机问题-

  • 斐波那契数列
  • 背包问题
  • 河内塔
  • 全双最短路径
  • Dijkstra最短路径
  • 项目进度

动态编程可以自顶向下和自底向上两种方式使用。当然,在大多数情况下,就CPU周期而言,引用以前的解决方案输出要比重新计算便宜。