提示:努力生活,开心、快乐的一天
题目链接:1143. 最长公共子序列
dp[i][j] = dp[i - 1][j - 1] + 1
;dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
动态规划
var longestCommonSubsequence = function(text1, text2) {
let dp = new Array(text1.length+1).fill(0).map(v => new Array(text2.length+1).fill(0))
for (let i = 1; i <= text1.length; i++){
for (let j = 1; j <= text2.length; j++){
if (text1[i - 1] === text2[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])
}
}
}
console.log(dp)
return dp[text1.length][text2.length]
};
本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了,但要有相对顺序,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。
所以,递推公式有两种情况,两个字符串的值相等或者不想等的情况
题目链接:1035. 不相交的线
无
动态规划
var maxUncrossedLines = function(nums1, nums2) {
let m = nums1.length
let n = nums2.length
let dp = new Array(m+1).fill(0).map(v => new Array(n+1).fill(0))
for (let i = 1; i <= m; i++){
for (let j = 1; j <= n; j++){
if (nums1[i - 1] === nums2[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])
}
}
}
console.log(dp)
return dp[m][n]
};
把题分析透了,其实就是求两个字符串的最长公共子序列的长度
题目链接:53. 最大子数组和
1.最终返回的不是dp[nums.size() - 1],而是dp数组中最大的值
动态规划
var maxSubArray = function (nums) {
let dp = new Array(nums.length).fill(0)
dp[0] = nums[0]
for (let i = 1; i < nums.length; i++){
dp[i] = Math.max(nums[i],dp[i-1]+nums[i])
}
console.log(dp)
return Math.max(...dp)
};
该题还有贪心算法,可以根据贪心解出该题
这道题最终返回结果会与原本想的不一样,但需要写该题的全程,牢记dp[i]的含义
最近的动规的题,前后都有比较深的联系,能举一反三的进行