您现在的位置是:首页 >技术教程 >代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划网站首页技术教程

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

weixin_42474696 2024-10-18 00:01:02
简介代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划


一、1143.最长公共子序列

  1. dp数组含义还是像上面的那样,便是0到i-1(包括i-1)的最长公共子序列
  2. 如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;
    如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。
    public int longestCommonSubsequence(String text1, String text2) {
        int[][] dp = new int[text1.length()+1][text2.length()+1];
        int max = 0;
        for(int i=1;i<=text1.length();i++){
            for(int j=1;j<=text2.length();j++){
                if(text1.charAt(i-1)==text2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1]+1;
                } else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
                max = Math.max(max,dp[i][j]);
            }
        }
        return max;

    }

11分钟

二、1035.不相交的线

  1. 看成是最长公共子序列
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        //最长公共子序列
        int[][] dp = new int[nums1.length+1][nums2.length+1];
        int max = 0;
        for(int i=1;i<=nums1.length;i++){
            for(int j=1;j<=nums2.length;j++){
                if(nums1[i-1]==nums2[j-1]){
                    dp[i][j] = dp[i-1][j-1]+1;
                } else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
                max = Math.max(max,dp[i][j]);
            }
        }
        return max;
    }

10分钟

三、53. 最大子序和 动态规划

  1. dp表示以i为结尾的最大子数组和。这里只需要num.length的空间就可以
  2. 注意:int result = 0;来初始化是错的,应该使用第一个值来初始化result。int result = nums[0];
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];//以i为结尾的最大子数组和
        dp[0] = nums[0];
        for(int i=1;i<nums.length;i++){
            dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);//继续加,重新开始
        }
        // return dp[nums.length-1];
        // int result = 0;
        int result = nums[0];
        for(int i=0;i<dp.length;i++){
            result = Math.max(result,dp[i]);
        }
        return result;
    }

20分钟

总结

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。