力扣● 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

相关文章

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>