📜  DAA-动态编程

📅  最后修改于: 2021-01-12 03:34:29             🧑  作者: Mango


动态编程也用于优化问题。像分治法一样,动态规划通过组合子问题的解决方案来解决问题。此外,动态编程算法只解决一次每个子问题,然后将其答案保存在表格中,从而避免了每次重新计算答案的工作。

问题的两个主要属性表明,可以使用动态编程来解决给定的问题。这些属性是重叠的子问题和最优子结构

重叠子问题

与分而治之的方法类似,动态编程也将解决方案结合到子问题中。它主要用于需要反复解决一个子问题的场合。计算出的解存储在一个表中,因此不必重新计算这些解。因此,在存在重叠子问题的地方需要此技术。

例如,二进制搜索没有重叠的子问题。而斐波那契数的递归程序具有许多重叠的子问题。

最佳子结构

如果可以使用子问题的最优解获得给定问题的最优解,则给定问题具有最优子结构属性。

例如,最短路径问题具有以下最佳子结构属性-

如果节点x位于从源节点u到目标节点v的最短路径中,则从uv的最短路径是从ux的最短路径和从xv的最短路径的组合。

标准的全对最短路径算法(例如Floyd-Warshall和Bellman-Ford)是动态编程的典型示例。

动态规划方法的步骤

动态编程算法使用以下四个步骤进行设计-

  • 表征最佳解决方案的结构。
  • 递归定义最佳解决方案的值。
  • 通常以自下而上的方式计算最佳解决方案的价值。
  • 根据计算出的信息构造最佳解决方案。

动态规划方法的应用

  • 矩阵链乘法
  • 最长的公共子序列
  • 旅行商问题