第一题
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
对比两个字符串/数组之间的状态,要用二维dp来标志两个比较的状态,行为nums1,列为nums2。
和 最长公共子串 很像
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
int maxLen = 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]);//注意这一行,最长公共子串没有这一行
if (dp[i][j] > maxLen) maxLen = dp[i][j];
}
}
return maxLen;
}
};
第二题
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
第三题
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
一定要记得设好dp大小,以及dp初始化,i从1开始。dp求的是以nums[i]为结尾的最大子序列和,max dp[i]才是题意要求的。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size());
dp[0] = nums[0];
for (int i = 1; i < nums.size(); i++) {
dp[i] = max(dp[i-1]+ nums[i], nums[i]);
}
int maxSum = *max_element(dp.begin(), dp.end());
return maxSum;
}
};