基础
刷题
- 最长递增子序列
动规五部曲:
- 确定dp数组含义
dp[i] 记录以i结尾的递增最长子序列
- 确定dp数组递推公式
if nums[i] > nums[j] {
dp[i] = max(dp[j] + 1, dp[i])
}
// 遍历0-i的nums,当nums[j] < nums[i], nums[i]就可以作为dp[j]的结尾,最终比较出一个最长的子序列
- 确定dp数组初始化
dp[i] = 1 //最小为1
- 确定dp数组遍历顺序
i从左到右
j从左到右,从右到左都可以
- 打印dp数组
贪心+ 二分优化
- 最长连续递增序列
动规五部曲:
- 确定dp数组含义
dp[i] 是 以nums[i]为结尾的最长连续递增子序列, 从后面的递推公式得知,只需要保留dp[i-1]的值,故将dp数组缩减到长度为1,这里设定dp为int,也就是dp[i-1]
- 确定dp数组递推公式
if nums[i] > nums[i-1]
dp[i] = dp[i-1] + 1
else
dp[i] = 1
- 确定dp数组初始化
dp[i] = 1
- 确定dp数组遍历顺序
从左到右
- 打印dp数组
- 最长重复子数组
动规五部曲:
- 确定dp数组定义
二维dp数组:
dp[i][j] 是以nums1[j-1]结尾的数组 和 以nums2[i-1]为结尾的数组的最长重复子数组
一维dp数组: dp[j] 是以nums1[j-1]结尾的数组 和 以nums2[i]为结尾的数组的最长重复子数组
- 确定dp数组递推公式
二维dp数组:
dp[i][j] = dp[i-1][j-1] + 1
一维dp数组:
dp[i] = dp[i-1] +1
- 确定dp数组的初始化
二维dp数组:
dp[0][j] = 0
dp[i][0] = 0
一维dp数组:
dp[0] = 0
- 确定dp数组遍历顺序
二维dp数组:
从上到下,从左到右
一维dp数组:
从右到左
- 打印dp数组
总结
dp数组其实就是一个保存递归过程中的 状态或者 临时值,他可以是一个变量也可以是数组,服务于最终要求的结果。