动态规划
动态规划是利用问题的可划分性,以及子问题之间的相似性来降低求解复杂度的方法。动态规划将原问题视为若干个重叠子问题的逐层推进,每个子问题的求解都是一个阶段,在完成前一阶段的计算后才可以进行下一阶段的计算。
形象地讲,动态规划将一个构成问题解得连续序列划分成了一个一个阶段,这样我们可以在阶段的基础上统计到达当前阶段时的最优解,类似于我们学习组合数学时,将加法统计转化为乘法统计的过程。
举个例子吧,投掷一枚骰子两次,总共有多少种不同的可能,按照搜索的思想,我们每次都完整地搜索到一种可能的状态后进行累加,最终的和就是界,例如我们可以枚举(1,1),(1,2),(1,3)…(6,5),(6,6)等等,最终统计的结果为38种,而动态规划则先统计第一个阶段的可能数为6种,再统计第一阶段与第二阶段组合的可能数为6×6=36种,这样时间复杂度就降低了很多。
为了保证这些计算能够顺序地,不重复地进行,动态规划要求已经求解的子问题不能对后续阶段产生影响,这个条件被称为无后效性,换言之,动态规划对于状态空间的遍历形成了一个有向无环图,遍历顺序就是该有向无环图的一个拓扑序。有向无环图中的节点对应问题中的状态,图中的边则对应状态之间的转移关系,换句话说,无环图中的节点就是我们定义的dp数组记录的内容,我们用dp记录的内容表示问题的一个中间态,而图中的边则表示状态转移方程形成的转移关系。
在很多情况下,动态规划用于求解最优化问题,此时下一个阶段的最优解应该能够由前面阶段的子问题的最优解导出,这个条件被称为最优子结构性质。当然,这是一种比较片面的说法,它其实告诉我们,动态规划在阶段计算完成时,只会在每个状态上保留与最终解集相关的部分代表信息,这些重复信息应该具有可重复的求解过程,并能够导出后续阶段的代表信息。这样动态规划对状态的抽象和子问题的重叠递进才能起到优化作用。
动态规划的三要素
动态规划的三要素分别是状态,阶段以及决策,而子问题重叠,无后效性以及最优子结构的性质是能够应用动态规划的基本条件。
动态规划的过程就像是用一个给定的函数在一个数据集上重复计算的过程,这个函数对应的是动态规划里的状态转移方程,我们可以利用状态转移方程不断迭代输入输出,最终得到目标解。