目录
题目链接:1143.最长公共子序列
思路
代码
题目链接: 1035.不相交的线
思路
代码
题目链接: 53. 最大子序和
思路
代码
总结
题目链接:1143.最长公共子序列
思路
①dp数组,dp[i][j]表示[0,i-1]的text1和[0,j-1]的text2最长公共子序列的长度为dp[i][j]
②递推公式,如果当前字符相等则dp[i][j] = dp[i-1][j-1] + 1,否则dp[i][j] = max(dp[i-1][j], dp[i][j-1])
③dp数组初始化,dp[i][0]和dp[0][j]都初始化为0,因为和空串的子序列长度一定为0
④遍历顺序,从前往后,先遍历哪个字符串都行
⑤推导dp数组
代码
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int result = 0;vector<vector<int>> dp(text1.size() + 1,vector<int>(text2.size() + 1, 0));// 第一行和第一列初始化为0,创建dp数组时已经全部初始化为0了,这步可以跳过for (int i = 1; i <= text1.size(); i++) {for (int j = 1; j <= text2.size(); j++) {// 如果前一个字符相等,则累加长度if (text1[i - 1] == text2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;}// 如果不相等,则取左和上的最大值else {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}// 更新最长公共子序列的长度result = result > dp[i][j] ? result : dp[i][j];}}return result;}
};
题目链接:1035.不相交的线
思路
两个字符串分别在上下两条线上,值相等即可连线,求最大连线数,又要求线不能相交。实际还是求最长公共子序列的长度。
代码
class Solution {
public:// 求最长公共子序列int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size() + 1,vector<int>(nums2.size() + 1, 0));for (int i = 1; i <= nums1.size(); i++) {for (int j = 1; j <= nums2.size(); j++) {if (nums1[i - 1] == nums2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[nums1.size()][nums2.size()];}
};
题目链接:53. 最大子序和
思路
①dp数组,dp[i]表示下标为i的最大子序列之和,包括i
②递推公式,dp[i] = max(dp[i-1] + nums[i], nums[i])
③dp数组初始化,dp[0] = nums[0]
④遍历顺序,正序遍历
⑤推导dp数组
代码
class Solution {
public:int maxSubArray(vector<int>& nums) {int len = nums.size();if (len == 1)return nums[0];vector<int> dp(len, 0);dp[0] = nums[0];int result = dp[0];for (int i = 1; i < len; i++) {dp[i] = max(dp[i - 1] + nums[i], nums[i]);result = result > dp[i] ? result : dp[i];}return result;}
};
总结
①理解题意,将题目转换成熟悉的问题
②动规五部曲
③该复盘了