(WHAT)什么是动态规划?
动态规划是一种将复杂问题分解成更小的子问题来解决的优化技术。
(HOW)如何使用动态规划解决问题
用动态规划解决问题,需要遵循三个步骤:
- 定义子问题;
- 实现要反复执行来解决子问题的部分;
- 识别并求解出边界条件。
(WHERE)在哪些场景或常见问题中需要使用动态规划
- 背包问题
给出一组项目,各自有值和容量,目标是找出总值最大的项目的集合。这个问题的限制是,总容量必须小于等于“背包”的容量。 - 最长公共子序列
找出一组序列的最长公共子序列(可由另一序列删除元素但不改变余下元素的顺序而得到) - 矩阵链相乘
给出一系列矩阵,目标是找到这些矩阵相乘的最高效办法(计算次数尽可能少)。相乘操作不会进行,解决方案是找到这些矩阵各自相乘的顺序。 - 硬币找零
给出面额为d1……dn的一定数量的硬币和要找零的钱数,找出有多少种找零的方法。 - 图的全源最短路径
对所有顶点对(u, v),找出从顶点u到顶点v的最短路径。