动态规划(Dynamic Programming,简称 DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
工作原理:
动态规划的工作原理基于两个核心概念:
- 重叠子问题:在求解问题的过程中,有些子问题可能会被重复计算多次。动态规划通过保存子问题的解,避免了这些重复计算。
- 最优子结构:如果问题的最优解可以由其子问题的最优解有效地构造出来,那么该问题就具有最优子结构性质。
动态规划通常包含以下步骤:
- 定义状态:描述问题的子结构,即子问题的解。
- 状态转移方程:描述如何从子问题的解构造出原问题的解。
- 初始化:为最小的子问题设置初始值。
- 计算:按照某种顺序(通常是从最小子问题到最大子问题)计算所有子问题的解。
- 构造解:使用计算出的子问题的解来构造原问题的解。
实现方式:
动态规划的实现方式通常包括自底向上和带备忘录的自顶向下两种。
- 自底向上:从最小的子问题开始,逐步计算更大子问题的解,直到求解出原问题的解。这种方式通常使用表格或数组来保存子问题的解。
- 带备忘录的自顶向下