力扣● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

2024-03-13 04:04

本文主要是介绍力扣● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

● 1143.最长公共子序列

1.dp数组含义。

dp[i][j]:数组1[0,i-1]范围的子数组和数组2[0,j-1]的子数组的公共子序列最长长度。注意这里不需要一定以A[i-1]/B[j-1]结尾,原因在下面有说明。

动态规划求子序列的问题,一般都是dp的下标相对于数组的下标偏移1,dp[i][j]对应A[i-1]和B[j-1]。

2.递推公式。

既然是公共子序列,如果A[i-1]==B[j-1] ,和● 300.最长递增子序列 一样,dp[i][j]应该在上一个公共子序列的基础上+1,那么上一个最长的公共子序列是哪一个,如果是dp[i][j]的定义是以A[i-1]/B[j-1]为结尾的子序列,那么要求上一个最长的公共子序列,dp[][]的两个下标有可能是[0,i-1]和[0,j-1]的任何一个值,所以这时两层循环里面还要有两层循环,肯定会超时。

所以按照dp[i][j]正确的定义,如果A[i-1]==B[j-1]的话,上一个最长的公共子序列就是dp[i-1][j-1]代表的,所以dp[i][j]=dp[i-1][j-1]+1。

如果不相等的话,不能直接跳过,比如abcde,ace,到了abc、ace的时候c!=e,那么dp[3][3]按照定义应该是2,等于dp[3][2]。把abc、ace倒过来,dp[3][3]又=dp[2][3]。A[i-1]和B[j-1]不相等,但是A[i-1]可能和B[j-1]之前的相等,B[j-1]可能和A[i-1]之前的相等,所以要取这两种情况的最大值。

so:

if(text1[i-1]==text2[j-1]){     //i-1/j-1可以加入,长度加1dp[i][j]=dp[i-1][j-1]+1;
}
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//2种情况

3.初始化。同样是dp[i][j]代表数组1的前i个和数组2的前j个的比较情况,所以第一行第一列都初始化为0.

4.遍历顺序。同样是i、j从1开始。

5.打印。

代码:

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int n1=text1.size();int n2=text2.size();vector<vector<int>> dp(n1+1,vector<int>(n2+1,0));for(int i=1;i<=n1;++i){for(int j=1;j<=n2;++j){if(text1[i-1]==text2[j-1]){     //i-1/j-1可以加入,长度加1dp[i][j]=dp[i-1][j-1]+1;}else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//2种情况}}return dp[n1][n2];}
};

摘自动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili文无cc_评论:

之前的题目,dp代表的序列都是要以[i-1]/[i]结尾求递增序列的时候,即都要确定最后一个元素是谁。

● 300.最长递增子序列 因为要求序列有序,所以必须确定序列最后一个元素的值,才能比较新加入序列的元素是不是递增的。● 674. 最长连续递增序列 和 ● 718. 最长重复子数组 求相等序列的时候,如果求连续相等子序列,则还是要确定序列最后一个元素的值;但是本题求的是不必连续的相等子序列,就不需要知道序列最后一个元素的值,只要知道范围内相等的序列长度就行,新来的相等元素可以直接加在序列后面。


● 1035.不相交的线   

上一题所要求的公共子序列,因为这个公共子序列指的是相对顺序不变,如果把这个子序列里面相等的元素A[i]和B[j]连接起来,要么是垂直,要么向一个方向偏斜,不会有相交的情况发生。所以可以绘制的最大连线数其实就是公共子序列的最大长度。

代码随想录:看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过1143.最长公共子序列,本题其实还有很有难度的。这是Carl为什么要先讲上题再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!上题是源题,这题是应用,需要转换。

转换的能力很重要,否则看见差不多的题目还是做不出来,要学会举一反三。


● 53. 最大子序和  动态规划

这篇关于力扣● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803593

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可