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

1143. 最长公共子序列

注意点:

1.dp[i][j]数组的大小是[text1.size()+1, text2.size()+1]与718. 最长重复子数组 一样的

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        // dp[i][j]:长度为[0,i-1]的text1和长度为[0,j-1]的text2的最长公共子序列为dp[i][j]
        vector> dp(text1.size()+1, vector(text2.size()+1, 0));

        for(int i = 1; i<= text1.size(); i++) {
            for(int j = 1; j <= text2.size(); j++) {
                // 当text1和text2遇到相同的字符的时候,dp[i][j]的上一位加1
                if(text1[i-1] == text2[j-1]) dp[i][j] = dp[i-1][j-1]+1;
                // 当text1和text2不相等的时候,选取左边或者上面最大的那个数字
                else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
            }
        }
        // 由于结果是从三个方向,也就是左 上 左上三个位置向右下方向进行的,所以最大的数值是最后一个
        return dp[text1.size()][text2.size()];

    }
};
1035. 不相交的线

注意点:

1.没什么注意点,和 1143. 最长公共子序列 一模一样

class Solution {
public:
    int maxUncrossedLines(vector& nums1, vector& nums2) {

        vector> dp(nums1.size()+1, vector(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. 最大子数组和

注意点:

1.递推公式,主要就是讲dp[i-1]+nums[i]与nums[i]进行比较,如果dp[i-1]+nums[i]>nums[i],则相加,否则将从nums[i]重新计数

2.数组初始化的时候,int result = dp[0];

class Solution {
public:
    int maxSubArray(vector& nums) {
        if(nums.size() == 1) return nums[0];
        // dp[i]:以nums[i]为结尾  的最大连续子序列和为dp[i]
        vector dp(nums.size());
        dp[0] = nums[0];
        int result  = dp[0];
        for(int i = 1; i < nums.size(); i++) {
// 递推公式,主要就是讲dp[i-1]+nums[i]与nums[i]进行比较,如果dp[i-1]+nums[i]>nums[i],则相加,否则将从nums[i]重新开始计数
            dp[i] = max(dp[i-1]+nums[i], nums[i]);
// 最后一位不一定是最大的,所以需要进行遍历
            if(dp[i] > result) result = dp[i];
        }

        return result;
    }
};

你可能感兴趣的:(刷题,动态规划,算法,leetcode)