1.5 KiB
1.5 KiB
子序列问题
300. 最长递增子序列
dp[i]
表示以nums[i]
结尾的最长递增子序列的长度- 遍历
j
从0
到i
,if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1)
dp[i] = 1
- 外层遍历
i
内层遍历j
,都是从前往后
674. 最长连续递增序列
dp[i]
表示以nums[i]
结尾的最长连续递增子序列的长度- 递推公式:
if (nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1
if (nums[i] <= nums[i - 1]) dp[i] = 1
dp[0] = 1
- 从前往后
718. 最长重复子数组
dp[i][j]
表示以i
为下标结尾的 A 和以j
为下标结尾的 B 的最长重复子数组if (nums1[i] == nums2[j]) dp[i][j] = dp[i - 1][j - 1] + 1
否则为0
- 初始化:
if (nums1[i] == nums2[0]) dp[i][0] = 1
否则为0
if (nums1[0] == nums2[j]) dp[0][j] = 1
否则为0
- 其它都初始化为
0
- 都从前往后遍历,下标从
1
开始
1143. 最长公共子序列
dp[i][j]
表示以i
为下标结尾的 text1 和以j
为下标结尾的 text2 的最长公共子序列- 递推公式
if (text1[i] == text2[j]) dp[i][j] = dp[i - 1][j - 1] + 1
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
- 只需要初始化三个:
dp[0][0]
dp[1][0]
dp[0][1]