LeetCode动态规划归纳
最近刷了很多动态规划的问题,归纳一下做动态规划的题的方法。
动态规划很多题目是解决最多最少最大最小的问题。
动态规划问题的基本做法是:
- 确定递推量
- 推出递推式
- 确定边界
在解决上述问题的同时,要时刻注意如何把全局的问题变成局部的(最优子结构),如何把前面计算过的子问题利用起来(重叠子问题)。
下面把动态规划题分为几种类型。
算种数的动态规划
典型的题目包括:
62.Unique Paths
91.Decode Ways
95.Unique Binary Search Trees II
这类型的题目主要是算种数,依靠前面算出的种数算后面的种数。第70题Climbing Stairs和91题Decode Ways是利用了斐波那契数列,两道题目非常相似。第95题Unique Binary Search Trees II是卡特兰数的应用。第62题Unique Paths和63题Unique Paths II是两道二维的算种数的问题。
二维动态规划
典型的题目包括:
62.Unique Paths
这五道题是二维的动态规划,二维动态规划相当于填一张二维的表。经常的做法先填完第一行和第一列,然后其他的几行用一个两次循环,每一个空格通过相邻的左边[i][j-1],上边[i-1][j]或着对角[i-1][j-1]来填完所有项。
局部动态规划
典型的题目包括:
300.Longest Increasing Subsequence
这类型题目的特点是它最后一个的递推量并不是相应的最优解,而是所有递推量的最大值才是最优解。(当然你也可以设置两个递推量,一个全局的,一个局部的,而这里考虑的递推量是局部的),递推量的特点是一定包括自己,所以是局部的。
全局动态规划
典型的题目包括:
198.House Robber
213.House Robber II
这是最普通的动态规划,相对于局部动态规划递推量就是最优解。
递归和动态规划
典型的题目包括:
403.Frog Jump
主要是利用“备忘录”的方法,在递归的基础上将子问题的解记录。普通的动态规划从下往上,递归的动态规划从上往下再从下往上,要注意递推量的确定,递推量必须是唯一。
以上是最近做的一些题目的归纳,后续的题目会继续添加