一、简介
动态规划(Dynamic Programming):简称 DP,是一种优化算法,它特别适合去优化一些问题,如最短路径等(设计到最小化以及最大化的问题,都可以考虑该方法),它具有通用性。通俗来讲,可以将其视为一种穷举搜索算法,但是不同于穷举算法,它会避免许多无意义的重复操作,从而节省时间,因此也可以将其描述为“谨慎的蛮力”。
tips:动态规划一词最早由理查德·贝尔曼于 1957 年在其著作《动态规划(Dynamic Programming)》一书中提出。这里的 Programming 并不是编程的意思,而是指一种[表格处理方法],即将每一步计算的结果存储在表格中,供随后的计算查询使用,据说是最早用于处理火车的规划问题。还有另一个原因就是,本来贝尔曼想以“研究(research)”之类的词进行命名,但是国防部的官员对“研究”一词极为恐惧和厌恶,因此就采用了Programming一词(折中方案)。
DP问题存在这样一个通用的框架:
- 记忆化处理(记录每次计算的结果)。
- 找出子问题(它往往与其他问题有所关联,其结果可以被重复使用,
注:子问题的依赖关系应是非循环的
)。 - 穷举所有可能的结果(也就是
猜
,如最短路径),有的算法不需要这一步处理。
因此DP问题也可以被描述为一个:
递归+记忆化处理+猜(可能存在)