Day53 动态规划part14 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和

Day53 动态规划part14 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和

1143. 最长公共子序列

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0));//长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]
        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]);
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

1035. 不相交的线

问题转化为求最长相同子序列

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1)); //nums1.size()+1 * 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. 最大子数组和

class Solution {
public:
    int maxSubArray(vector<int>& nums) { //贪心,一旦有0,重新找起点计数
//         int result = INT32_MIN;
//         int count = 0;
//         for(int j = 0; j
//             count += nums[j];
//             result = count > result ? count : result;
//             count = count < 0 ? 0 :count;
//         }
//  return result;
    vector<int> dp(nums.size());
    if (dp.size()==0) return 0;
    dp[0] = nums[0];
    int result = dp[0];
    for(int i = 1; i<nums.size();i++){
        dp[i] = max(dp[i-1]+nums[i],nums[i]);
        result = (result>dp[i])?result:dp[i];
    }
    return result;
    }
};

你可能感兴趣的:(动态规划,算法,数据结构,leetcode,c++)