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

目录

  • 1143.最长公共子序列
    • 思路
    • 代码
  • 1035.不相交的线
    • 思路
    • 代码
  • 53. 最大子序和 动态规划
    • 思路
    • 代码

代码随想录

1143.最长公共子序列

思路

思路:这一题跟最长上升子序列有关。
dp[i][j]表示字符串A从0-i-1与字符串B 从0-j的最长公共子序列的长度。
dp[0][0]=0
if(c1[i-1]==c1[j-1])
dp[i][j]=dp[i-1][j-1]+1
否则dp[i][j]=max(dp[i][j-1],dp[i-1][j])

代码

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int dp[][] = new int[text1.length()+1][text2.length()+1];
        char c1[] = text1.toCharArray();
        char c2[] = text2.toCharArray();

        for(int i = 1;i<=text1.length();i++){
            for(int j = 1;j<=text2.length();j++){
                if(c1[i-1]==c2[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]);
                }
                    
            }
        }

        return dp[text1.length()][text2.length()];

    }
}


1035.不相交的线

思路

思路:本质上是最长公共子序列

dp[i][j]表示数组A从0-i-1与数组B 从0-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][j-1],dp[i-1][j])

代码

class Solution {
    public int maxUncrossedLines(int[] nums1, int[] nums2) {
        int dp[][] = new int[nums1.length+1][nums2.length+1];

        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][j-1],dp[i-1][j]);

            }
        }

        return dp[nums1.length][nums2.length];

    }
}

53. 最大子序和 动态规划

思路

思路:贪心或动态规划 ,之前用的是贪心的思路
动态规划
定义dp[i]表示从0-i-1元素的最大和连续数组
初始化dp[0]=0

要不就是前面加起来最大,要不就是只取当前值最大
dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);

代码

class Solution {
    public int maxSubArray(int[] nums) {

       int dp[] = new int[nums.length];
       dp[0]=nums[0];
       int sum = nums[0];
       for(int i =1;i<nums.length;i++){

           dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);
           sum = Math.max(sum,dp[i]);

       }

        return sum;

    }
}

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