Day 43 - 动态规划 Part10

35 阅读2分钟

基础

刷题

  1. 最长递增子序列

leetcode.cn/problems/lo…

image.png

动规五部曲:

  • 确定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数组

贪心+ 二分优化

image.png

  1. 最长连续递增序列

leetcode.cn/problems/lo…

image.png

动规五部曲:

  • 确定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数组
  1. 最长重复子数组

leetcode.cn/problems/ma…

image.png

动规五部曲:

  • 确定dp数组定义

二维dp数组:

dp[i][j] 是以nums1[j-1]结尾的数组 和 以nums2[i-1]为结尾的数组的最长重复子数组

image.png

一维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数组其实就是一个保存递归过程中的 状态或者 临时值,他可以是一个变量也可以是数组,服务于最终要求的结果。