动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。
20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。
1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
动态规划(Dynamic Programming,简称DP)是一种算法设计技术,它通常用于求解具有重叠子问题和最优子结构特性的复杂问题。动态规划算法能够将一个复杂问题分解成一系列简单的子问题,并通过合理的方式保存子问题的解,以避免重复计算,从而提高效率。
动态规划的关键特点包括:
- 重叠子问题:在解决原问题的过程中,相同的子问题会被多次遇到和求解。
- 最优子结构:原问题的最优解包含了其子问题的最优解。也就是说,我们可以通过组合子问题的最优解来构造原问题的最优解。
- 存储子问题的解:动态规划算法通常会使用一个表(通常是数组或哈希表)来存储子问题的解,这样在下一次遇到相同的子问题时,可以直接查表获得答案,而不是重新计算。
- 构建解决方案:动态规划通常从最简单的子问题开始求解,并逐步构建更复杂问题的解,直到得到原问题的解。
动态规划算法通常有两种实现方式:
- 自顶向下:这种方法使用递归来解决问题,并通过“记忆化”