【代码随想录】Day 53 动态规划14(最长公共子序列、不相交的线、最大子序和)

第一题 

力扣(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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43785314/article/details/132676678
今日推荐