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

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

一、力扣1143.最长公共子序列

题目链接

思路:最长重复子序列是以i和j结尾的区间,numi=numj dpij=dpi-1j-1+1

最长公共子序列,dpij定义为0-i和0-j区间内最长公共子序列的长度,区间结尾处相等自然等于dpij=dpi-1j-1+1,不等就继承上一个区间的长度,max(dpi-1j, dpij-1)

java 复制代码
class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int[][] dp = new int[text1.length()+1][text2.length()+1];
        for (int i = 1; i <= text1.length(); i++) {
            char c1 = text1.charAt(i-1);
            for (int j = 1; j <= text2.length(); j++) {
                if (c1 == 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]);
                }
            }
        }
        return dp[text1.length()][text2.length()];
    }
}

二、力扣1035.不相交的线

题目链接

思路:这个最多数量的不想交的线和最长公共子序列是一样的。

java 复制代码
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-1][j], dp[i][j-1]);
                }
            }
        }
        return dp[nums1.length][nums2.length];
    }
}

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

题目链接

思路:求最长子序列和,dpi就只能从两种方式中得出,一种是把numi加入前面的子序列,另一种就是把当前的numi作为一个新的子序列的开头,dpi=max(dpi-1+numi, numi)

java 复制代码
class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = dp[0];
        for (int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
            if (max < dp[i]) max = dp[i];
        }
        return max;
    }
}
相关推荐
星马梦缘5 分钟前
算法设计导论 课堂笔记
算法·动态规划·分治·时间复杂度·最优二叉树
luj_176811 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海13 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz14 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni14 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu14 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_79815 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭15 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶15 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶15 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展