代码随想录算法训练营第53天|1143.最长公共子序列,1035.不相交的线,53. 最大子序和

1143.最长公共子序列

力扣题目链接

思路

  • dp[i][j] 表示分别以text1[i-1]和text2[j-1]结尾的个字符串的最长公共子序列的长度
  • 递推公式: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]);
  • 初始化:都为0
  • 遍历顺序:从前往后

代码

class Solution {
public:
    /*
     * dp[i][j] 表示分别以text1[i-1]和text2[j-1]结尾的个字符串的最长公共子序列的长度
     * 递推公式: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]);
     * 初始化:都为0
     * 遍历顺序:从前往后
    */
    int longestCommonSubsequence(string text1, string text2) {
        vector> dp(text1.size()+1,vector(text2.size()+1,0));
        int result=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=max(result,dp[i][j]);
            }
        }
        return dp[text1.size()][text2.size()];
    }
};
  • 时间复杂度O(mn)
  • 空间复杂度O(mn)

1035.不相交的线

力扣题目链接

思路

  • dp[i][j] 表示分别以nums1[i-1]和nums2[j-1]结尾的个字符串的最长公共子序列的长度
  • 递推公式: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]);
  • 初始化:都为0
  • 遍历顺序:从前往后

代码

class Solution {
public:
    /*
     * dp[i][j] 表示分别以nums1[i-1]和nums2[j-1]结尾的个字符串的最长公共子序列的长度
     * 递推公式: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]);
     * 初始化:都为0
     * 遍历顺序:从前往后
    */
    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()];
    }
};
  • 时间复杂度O(mn)
  • 空间复杂度O(mn)

53. 最大子序和

力扣题目链接

思路

  • dp[i] 表示以nums[i]结尾的最大连续子数组和
  • 递推公式:dp[i]=max(nums[i],dp[i-1]+nums[i]);
  • 初始化:dp[0]=nums[0];
  • 遍历顺序:从前往后

代码

class Solution {
public:
    /*
     * dp[i] 表示以nums[i]结尾的最大连续子数组和
     * 递推公式:dp[i]=max(nums[i],dp[i-1]+nums[i]);
     * 初始化:dp[0]=nums[0];
     * 遍历顺序:从前往后
    */
    int maxSubArray(vector& nums) {
        if(nums.size()==1) return nums[0];
        vector dp(nums.size());
        dp[0]=nums[0];
        int result=nums[0];
        for(int i=1;i
  • 时间复杂度O(n)
  • 空间复杂度O(1)

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