代码随想录算法训练营第53天 | 1143.最长公共子序列 ,1035.不相交的线 ,53. 最大子序和

动态规划章节理论基础:

https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

1143.最长公共子序列

题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/

思路:

本题和动态规划:718. 最长重复子数组区别在于这里不要求是连续的了,但要有相对顺序,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。

动规五部曲:
(1)确定dp数组以及下标含义
dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]

(2)确定递归公式
主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同
如果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]的最长公共子序列,取最大的。
即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

(3)dp数组初始化
先看看dp[i][0]应该是多少呢?
test1[0, i-1]和空串的最长公共子序列自然是0,所以dp[i][0] = 0;
同理dp[0][j]也是0。
其他下标都是随着递推公式逐步覆盖,初始为多少都可以,那么就统一初始为0。

(4)确定遍历顺序
从递推公式,可以看出,有三个方向可以推出dp[i][j],如图:
在这里插入图片描述
那么为了在递推的过程中,这三个方向都是经过计算的数值,所以要从前向后,从上到下来遍历这个矩阵。

(5)举例推导dp数组
以输入:text1 = “abcde”, text2 = “ace” 为例,dp状态如图:
在这里插入图片描述
最后红框dp[text1.size()][text2.size()]为最终结果

代码:

class Solution {public int longestCommonSubsequence(String text1, String text2) {int m = text1.length();int n = text2.length();// dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]int[][] dp = new int[m + 1][n + 1];//int result = 0;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; 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]);}//result = Math.max(dp[i][j],result);}}return dp[m][n];}
}

1035.不相交的线

题目链接:https://leetcode.cn/problems/uncrossed-lines/description/

思路:

直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。

拿示例一A = [1,4,2], B = [1,2,4]为例,相交情况如图:
在这里插入图片描述
其实也就是说A和B的最长公共子序列是[1,4],长度为2。 这个公共子序列指的是相对顺序不变(即数字4在字符串A中数字1的后面,那么数字4也应该在字符串B数字1的后面)

这么分析完之后,大家可以发现:本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!
那么本题就和我们刚刚讲过的这道题目动态规划:1143.最长公共子序列就是一样一样的了。

一样到什么程度呢? 把字符串名字改一下,其他代码都不用改,直接copy过来就行了。

代码:

class Solution {public int findLengthOfLCIS(int[] nums) {int n = nums.length;int[] dp = new int[n];// if (n <= 1)// return 1;int result = 1;Arrays.fill(dp, 1);for (int i = 1; i < n; i++) {if (nums[i] > nums[i - 1])dp[i] = dp[i - 1] + 1;if (dp[i] > result)result = dp[i];}return result;}
}

53. 最大子序和

题目链接:https://leetcode.cn/problems/maximum-length-of-repeated-subarray/description/

思路:

这道题之前我们在讲解贪心专题的时候用贪心算法解决过一次,贪心算法:最大子序和 。
这次我们用动态规划的思路再来分析一次。

动规五部曲:
(1)确定dp数组以及下标含义
dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。

(2)确定递归公式
dp[i]只有两个方向可以推出来:
dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
nums[i],即:从头开始计算当前连续子序列和
一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

(3)dp数组初始化
从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,dp[0]就是递推公式的基础。
dp[0]应该是多少呢?
根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。

(4)确定遍历顺序
递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。

(5)举例推导dp数组
以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下:
在这里插入图片描述
注意最后的结果可不是dp[nums.size() - 1]! ,而是dp[6]。

在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。

那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。

所以在递推公式的时候,可以直接选出最大的dp[i]。

代码:

class Solution {public int maxSubArray(int[] nums) {int n = nums.length;int[] dp = new int[n];dp[0] = nums[0];int result = dp[0];for(int i=1;i<n;i++){// 有两种策略,一种是从当前数字开始算,一种是从前面取dp[i] = Math.max(nums[i],dp[i-1]+nums[i]);result = Math.max(result,dp[i]);} // 最后的结果不是dp[n-1],需要注意return result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13|连接数据库:通过链和代理查询鲜花信息

新的数据库查询范式 提出问题&#xff1a;用户用自然语言提出一个问题&#xff0c;例如“去年的总销售额是多少&#xff1f;”。LLM 理解并转译&#xff1a;LLM 首先会解析这个问题&#xff0c;理解其背后的意图和所需的信息。接着&#xff0c;模型会根据解析的内容&#xff0c…

2024年零基础转行软件测试真的可以吗?“我“该如何做?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 零基础的学生&…

博图西门子HMI下载报错—缺少面板映像,下载失败解决办法

一、报错展示 二、解决过程 1、第一种&#xff1a; 在安装博图(V17)时&#xff0c;需要下载各类软件&#xff0c;这时钩选全部能够选择的软件。然后进行下载。但是在这里我遇到了下载软件时&#xff0c;无法选择红框中的文件。那么就需要单独去西门子官网下载。 2、第二种&am…

MQ之Spring AMQP学习

Spring AMQP学习 Spring AMQP AMQP是Advanced Message Queuing Protocol的缩写。AMQP是用于在应用程序之间传递消息的开放标准&#xff0c;该协议与语言和平台无关&#xff0c;更符合微服务中独立性的要求。 Spring AMQP是基于AMQP协议定义的一套API规范&#xff0c;提供了模…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论&#xff1a; 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…

关系数据库:关系数据结构基础与概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

外包2月,技术倒退警钟长鸣。。。。。

曾经的我&#xff0c;作为一名大专生&#xff0c;在湖南某软件公司从事功能测试工作近四年。日复一日的工作让我陷入舒适区&#xff0c;不思进取。直到今年8月&#xff0c;我才意识到自己的技术停滞不前&#xff0c;女友的离开更是让我痛定思痛&#xff0c;决定改变现状&#x…

极速下载,轻松管理—互联网下载管理器(IDM)全面评测 万物皆可下的Internet Download Manager

在当今信息爆炸的时代&#xff0c;我们每天都在从互联网上下载各种资源&#xff0c;如文档、音乐、视频等。而一个高效、实用的下载工具对于提高我们的工作效率和生活品质至关重要。今天&#xff0c;我将为大家详细介绍一款备受好评的下载神器 — 互联网下载管理器&#xff08;…

详细教---用Django封装写好的模型

本次我们要用自己写好的热销词条爬虫代码来演示如何用Django把我们写好的模型封装。 第一步&#xff1a;代码准备 热搜词条搜集代码&#xff1a; import requests from lxml import etreeurl "https://tophub.today/n/KqndgxeLl9" headers{User-Agent: Mozilla/5.…

HarmonyOS NEXT应用开发之搜索页一镜到底案例

介绍 本示例介绍使用bindContentCover、transition、animateTo实现一镜到底转场动画&#xff0c;常用于首页搜索框点击进入搜索页场景。 效果图预览 使用说明 点击首页搜索框跳转到搜索页面显式一镜到底转场动画 实现思路 通过点击首页搜索框改变bindContentCover全屏模态…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

Linux 文件系统:C语言接口、系统接口

目录 一、文件接口 二、感性理解Linux系统下“一切皆文件” 三、C语言文件接口 1、fopen 2、当前路径 3、fwrite、fprintf、fputs 4、fgets 模拟实现cat命令 5、fscanf 五、系统接口 1、open系统调用 2、write系统调用 例&#xff1a;O_WRONLY 例&#xff1a;O_WR…

类和对象-2

文章目录 默认成员函数构造函数默认构造函数析构函数不同生命周期的构造、析构函数的执行顺序 默认成员函数 在c中&#xff0c;每个类里面都有六个默认成员函数。即便这个类什么都没有&#xff0c;也就是空类&#xff0c;也会有这六个成员函数。这些函数的存在极大的简化了代码…

洛谷_P5143 攀爬者_python写法

P5143 攀爬者 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 知识点&#xff1a; Python lambda&#xff08;匿名函数&#xff09; | 菜鸟教程 (runoob.com) import mathn int(input()) data [] for i in range(n):l list(map(int,input().split()))data.append(l)data.so…

网络简略总结

目录 一、三次握手 四次挥手 1、三次握手:为了建立长链接进行交互即建立一个会话,使用http/https协议 2、四次挥手是一个断开连接释放服务器资源的过程 3、如果已经建立了连接,但是客户端突然出现故障了怎么办? 4、谁可以中断连接?客户端还是服务端还是都可以? 5、…

投资者必读:如何利用龙虎榜数据捕捉市场热点

1.什么是龙虎榜 股票龙虎榜是指每个交易日证券交易所公布的关于股市交易活动的排行榜。龙虎榜主要展示了当日买卖最活跃的股票、买卖双方的机构或个人&#xff0c;以及他们的买卖金额和数量。这些数据可以帮助投资者了解市场的热点股票、资金流向和市场情绪。 通常&#xff0c…

《量子十年》报告更新!IBM精研量子计算,助力行业优化转型

近日&#xff0c;IBM商业价值研究院&#xff08;IBM Institute for Business Value&#xff0c;简称IBV&#xff09;精心出版了一本引人入胜的报告&#xff0c;《量子十年》第四版。这不仅是一本值得一读的书籍&#xff0c;更是对当前行业发展状况的全面总结和重要补充。 这部由…

Maven项目如何导入依赖包

一、导入依赖包 导入mysql依赖包 第一步&#xff1a;登录Maven官网 Maven官网&#xff1a;https://mvnrepository.com/search?qmysql 第二步&#xff1a;点击MySql Connector Java 第三步&#xff1a;点击任意一个版本 第四步&#xff1a;将以下内容复制到pom.xml中 导入j…

概率论基础概念和在AI中的应用

基本概念 概率论是数学的一个分支&#xff0c;它专注于分析和理解随机现象。通过概率论&#xff0c;我们可以量化不确定性&#xff0c;预测事件发生的可能性&#xff0c;并对复杂系统进行建模和分析。以下是一些概率论的基本概念和原理&#xff1a; 概率的定义 经典定义&…

随笔-生老病死

周末两天也没有出门&#xff0c;帮着一个朋友做了些图&#xff08;就这两天忙不过来&#xff09;&#xff0c;挣了点外快&#xff08;700&#xff09;&#xff0c;累得腰酸、眼花、脖子疼。 媳妇带着小孩出去玩&#xff0c;中间发了个视频&#xff0c;是小孩进了一个围棋培训班…