代码随想录算法训练营第五十三天 | 动态规划:子序列

文章目录

  • 动态规划:子序列
    • 题目
    • 对题目的想法
    • 实现中/后的感想

动态规划:子序列

题目

1143.最长公共子序列
1035.不相交的线
53. 最大子序和

对题目的想法

  1. 最大子序和在贪心算法中讲过一次,不过当时贪心算法没看懂看题解感觉dp更好理解。这一次重新自己写感觉特别简单。
  2. 最长公共子序列的思路毫无疑问和昨天的最长重复子数组很相似。用二维的dp数组实现,同时遍历两次数组,大概是 O ( N 2 ) O(N^2) O(N2)的时间复杂度。
  3. 不相交的线其实一开始看题目有点没理解。不过看了题目的hint意识到几乎和最长公共子序列完全一样。

实现中/后的感想

公共子序列:

if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
	dp[i][j] = dp[i - 1][j - 1] + 1;
}
else {
	dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
res = Math.max(res, dp[i][j]);

不相交的线:第一次写的时候尝试用dp[i][j] = dp[i - 1][j - 1] + A[i] == B[j] ? 1 : 0;然后发现并不对,当A[i] != B[j]时也还是要更新dp数组的。

if (A[i - 1] == B[j - 1]) {
	dp[i][j] = dp[i - 1][j - 1] + 1;
}
else {
	dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}

你可能感兴趣的:(算法)