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

  • 今日学习的文章链接,或者视频链接

第九章 动态规划part14

  • 自己看到题目的第一想法

  • 看完代码随想录之后的想法

1143

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int m = text1.size();
        int n = text2.size();
        int dp[m+1][n+1];
        memset(dp,0,sizeof(dp));
        for(int i = 1;i<=m;i++){
            for(int j = 1;j<=n;j++){
                if(text1[i-1]==text2[j-1]){
                    dp[i][j] = 1+dp[i-1][j-1];
                }else{
                    dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
                }
            }
        }
        return dp[m][n];
    }
};

1035

class Solution {
public:
    int maxUncrossedLines(vector& nums1, vector& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        vector> dp(m+1,vector(n+1,0));
        for(int i = 1;i <= m;i++){
            for(int j = 1;j <= n;j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j] = 1+dp[i-1][j-1];
                }else{
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[m][n];
    }
};

53

class Solution {
public:
    int maxSubArray(vector& nums) {
        //动态规划
        //以 nums[i] 为结尾的「最大子数组和」为 dp[i]
        int n = nums.size();
        vector dp(n,0);
        dp[0] = nums[0];
        int result = nums[0];
        for(int i = 1;i < n;i++){
            dp[i] = max(nums[i],nums[i]+dp[i-1]);
            result = max(result,dp[i]);
        }
        return result;


        /*贪心
        int n = nums.size();
        if(n==0) return 0;
        int result = nums[0];
        int cur = 0;
        for (int i=0;iresult){
                result = cur;
            }
            if(cur<0){
                cur = 0;
            }
        }
        return result;
        */
    }
};
  • 自己实现过程中遇到哪些困难

  • 今日收获,记录一下自己的学习时长

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