动态规划是一种算法思路,动态规划的核心思想是是利用存储的历史信息,使得未来需要的信息不再需要进行重复计算,从而实现降低时间复杂度,用空间复杂度来换取时间复杂度。
动态规划一般可分为以下几步:
- 确定递推量。确定递推过程中要保留的历史信息数量和具体含义,同时,也会定下动态规划的维度。
- 推导递推式。根据确定的递推量,得到如何利用存储的历史信息在有效时间(线性时间)内得到当前的信息结果
- 计算初始条件。有了递推式之后,我们只需要计算初始条件,然后根据递推式得到我们想要的结果。通常来说,初始条件都比较简单,一般都可直接赋值。
- 继续优化存储历史信息的空间维度。基于算法优化的考虑,一般来说,几维动态规划,我们用几维的存储空间是肯定可以实现的。但是,有时我们对于历史信息的要求不高,比如这一步只需要用到上一步的历史信息,而不需要更早的了,那么我们可以只存储每一步的历史信息,每步覆盖上一步的信息,这样便可以少一维的空间,从而优化算法的空间复杂度。
常见的记录历史信息方法:
- 使用固定值
- 使用一维数组
- 使用二维数组,很多问题看似很麻烦,但是用二维数组描述一下,可能就会豁然开朗