算法学习笔记之动态规划(Dynamic Programming,DP)

167 阅读1分钟

(WHAT)什么是动态规划?

动态规划是一种将复杂问题分解成更小的子问题来解决的优化技术

(HOW)如何使用动态规划解决问题

用动态规划解决问题,需要遵循三个步骤:

  1. 定义子问题;
  2. 实现要反复执行来解决子问题的部分;
  3. 识别并求解出边界条件。

(WHERE)在哪些场景或常见问题中需要使用动态规划

  1. 背包问题
    给出一组项目,各自有值和容量,目标是找出总值最大的项目的集合。这个问题的限制是,总容量必须小于等于“背包”的容量。
  2. 最长公共子序列
    找出一组序列的最长公共子序列(可由另一序列删除元素但不改变余下元素的顺序而得到)
  3. 矩阵链相乘
    给出一系列矩阵,目标是找到这些矩阵相乘的最高效办法(计算次数尽可能少)。相乘操作不会进行,解决方案是找到这些矩阵各自相乘的顺序。
  4. 硬币找零
    给出面额为d1……dn的一定数量的硬币和要找零的钱数,找出有多少种找零的方法。
  5. 图的全源最短路径
    对所有顶点对(u, v),找出从顶点u到顶点v的最短路径。