📅  最后修改于: 2023-12-03 15:21:48.448000             🧑  作者: Mango
动态编程(Dynamic Programming)是一种解决复杂问题的算法思想,它将一个问题分解为多个子问题,并将每个子问题的解决方案保存起来,避免了重复计算,从而实现高效解决大规模问题的目的。
指原问题的最优解可以通过子问题的最优解推导出来。也就是说,在某种最优化问题中,状态的最优解可以分解成若干个子问题的最优解。
在解决一个问题时,需要重复计算许多相同的子问题。动态规划算法为每个子问题只计算一次,从而减少计算量。
状态指的是每个子问题中需要求解的目标。通常情况下,状态是由若干个相关的变量组成的。例如,求解一个数组中的最大子序列,状态可以是选择的子序列的起始位置和结束位置。
状态转移方程是指用当前子问题的答案来推导下一个子问题的答案。通过状态转移方程,我们可以将一个大问题转化为若干个小问题,从而逐级求解。
初始状态指的是最小子问题的解。在动态规划算法中,我们通常从最小子问题开始逐步向上推导,直到求解出最终问题的解。
目标状态是指我们最终需要求解的问题。在动态规划算法中,我们需要将问题分解成若干个子问题,并定义所有子问题的目标状态,从而最终求解出原问题的解。
# 什么是动态编程?
动态编程(Dynamic Programming)是一种解决复杂问题的算法思想,它将一个问题分解为多个子问题,并将每个子问题的解决方案保存起来,避免了重复计算,从而实现高效解决大规模问题的目的。
## 动态编程的特征
1. 最优子结构性质
2. 重叠子问题性质
### 最优子结构性质
指原问题的最优解可以通过子问题的最优解推导出来。也就是说,在某种最优化问题中,状态的最优解可以分解成若干个子问题的最优解。
### 重叠子问题性质
在解决一个问题时,需要重复计算许多相同的子问题。动态规划算法为每个子问题只计算一次,从而减少计算量。
## 动态规划算法的元素
1. 状态(State)
2. 状态转移方程(Transition)
3. 初始状态(Initialization)
4. 目标状态(Target)
### 状态(State)
状态指的是每个子问题中需要求解的目标。通常情况下,状态是由若干个相关的变量组成的。例如,求解一个数组中的最大子序列,状态可以是选择的子序列的起始位置和结束位置。
### 状态转移方程(Transition)
状态转移方程是指用当前子问题的答案来推导下一个子问题的答案。通过状态转移方程,我们可以将一个大问题转化为若干个小问题,从而逐级求解。
### 初始状态(Initialization)
初始状态指的是最小子问题的解。在动态规划算法中,我们通常从最小子问题开始逐步向上推导,直到求解出最终问题的解。
### 目标状态(Target)
目标状态是指我们最终需要求解的问题。在动态规划算法中,我们需要将问题分解成若干个子问题,并定义所有子问题的目标状态,从而最终求解出原问题的解。