【算法练习Day45】最长公共子序列不相交的线最大子数组和

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 最长公共子序列
  • 不相交的线
  • 最大子数组和
  • 总结:

前两道题思路是一模一样的,但是需要认真理解,最后一道虽然思路不算难,但是需要注意的细节一点不少。

最长公共子序列

1143. 最长公共子序列 - 力扣(LeetCode)

最长公共子序列,与上一期最后一道的区别在于本题要求的是两个数组的可以删除中间数据的最长公共的部分。是删除中间部分的多于元素后,在不改变数据顺序情况下得到的最长公共子序列,

也就是要把求两数组的最长子序列的题,和求不连续最长子序列的题结合在一起的考题。

dp数组的含义:对于两个数组求子序列问题,通常我们要设立二维数组来辅助解题,二维数组的含义依然是到以i-1和j-1下标的对应数据 最长公共子序列为多长。是以i-1和j-1对应的下标对应的数据为结尾,是因为为了方便初始化,不懂得可以去看我上一期的文章。

递推公式:递推公式是有讲究的,这也是与上一期的最后一题的差别所在,求可以删除中间数据拼成的序列,也就是求非连续的子序列的问题,一定要用双for循环来遍历,

if(nums1【i-1】==nums2【j-1】)dp【i】【j】=dp【i-1】【j-1】+1

这也是之前我们讲过的递推公式,因为找到了一个相等的字符,所以就是上一个位置+1的长度。

那说回来,如果两个字符不相等呢?又如何用代码来表示两个数组之间的删除中间数据呢?这也就有了第二个递推公式

else dp【i】【j】=max(dp【i-1】【j】,dp【i】【j-1】)

也就是说如果两个数据此时不相等,那么它这个位置填入的长度应该就是dp【i-1】【j】,dp【i】【j-1】取最大值,为什么是这样呢?我们可以依照所给案例分析,abcde和ace,我们假设现在遍历到这两个数组的第2个位置,很显然2下标下c和e是不相等的,那么abc和ace的两部分最长公共子序列多长呢?既然知道这两个位置一定不等,那么就有两种情况,可能最大子序列存在于abc和ac的情况,也可能最大子序列存在于ab和ace的情况,这两种情况的最大子序列中,我们取最大值,也就是当前遍历的两字符不等的情况。

dp数组的初始化:数组的初始化也很简单,因为我们上一期已经讲过,对于这种二维数组的定义为i-1和j-1的含义时,第一行和第一列没有意义是非法状态,所以都初始化为0,而其他部分初始化什么值不重要,都会被递推公式所覆盖。

遍历顺序:从左到右,从上到下。

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>>dp(text1.size()+1,vector<int>(text2.size()+1,0));
        for(int i=1;i<=text1.size();i++){
            for(int j=1;j<=text2.size();j++){
                if(text1[i-1]==text2[j-1])
                dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

代码就是这样了,实际上也不是很难,但是那个else也就是字符不相等的情况,怎么去处理,相信对于第一次做这道题的朋友来说,还是很懵b的。

不相交的线

1035. 不相交的线 - 力扣(LeetCode)

这道题和第一道题思路一模一样,为什么这么说呢?它是求两数组相等数字俩俩连线,且不能相交,其实就是求两个数组的最长递增子序列,有多长,有多长就有几个连线。至于题中说的一个数据只能被连一次,那是一定的。例如第一个数组的某数据和第二个数组的连续两个数据都相等,但是根据递推公式它们的连线条数是根据之前连线条数有关,也就是说如果之前没有一样的数据,连线条数是0,那么dp【i-1】【j-2】和dp【i-1】【j-1】不也都是0吗,所以得到的连线条数都是1。这里你可以随便举例子,即使之前已经有一条连线,也仅仅只有dp【i】【j】能够变成2,而另一个也能够与第一个数组相等数据那个,是由dp【i-1】【j-2】推出来的,画dp数组就会知道,最大数都集中在斜线上,从左上角到右上角那条斜线,主导着大值。所以有时候打印dp数组还是很重要的。

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>>dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
        for(int i=1;i<=nums1.size();i++){
            for(int j=1;j<=nums2.size();j++){
                if(nums1[i-1]==nums2[j-1])
                dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp[nums1.size()][nums2.size()];
    }
};

好了,经过了一些列的分析我直接给出代码,代码和上一道题一模一样。

至于为什么这里的二维数组我们不需要result来存取最大值,然后输出,为什么这里的dp数组最后一位置是最大值呢?这是因为else那一条语句的缘故,因为我们求得是非连续的,而我们这样写递推公式dp【i】【j】会一直保留着之前的最长子序列的长度,自然也就不用result来存取最大值了。

最大子数组和

53. 最大子数组和 - 力扣(LeetCode)

这道题以前讲贪心算法时候,做过一次,我们再用动态规划思想,做一次,解题的思路不是很难,但是细节需要注意。起初我在想这道题的解法时候,递推公式也像上面的题一样,写成两个,但后来遇到全负数的数组却无法解出。

dp数组含义:dp数组的含义代表截止到i的连续的最大子数组和,根据dp数组的含义,也意味着我们这时候需要result来存储最大的和了。

递推公式:递推公式实际上是很简单的一句代码,但是由于前面两道题的启发,我有点想复杂了,

dp【i】=max(dp【i-1】+nums【i】,nums【i】)

其实看过贪心的朋友,再看这种思路反而应该更好想明白,dp数组由两个方向可以推出来,一个是前面的连续数组相加的和加上当前遍历到的数据做和,另一个是只有当前的数据,它们做一个比较,取较大者,其实仔细想想这样无论数组是否是纯负数都能得到解决了,起初的想法是result赋值为最小值,然后和result比较,再配上我那个ifelse语句,出了不少差错。

初始化和遍历顺序都是千篇一律这里不做讲解了。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int>dp(nums.size(),0);
        if(nums.size()==0)return 0;
        dp[0]=nums[0];int result=dp[0];
        for(int i=1;i<nums.size();i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);
            result=max(result,dp[i]);
        }
        return result;
    }
};

动态规划类题目,都是代码简单,思路难想,而且有的时候代码也有很多要注意的细节,要多练习。

总结:

今天我们完成了最长公共子序列、不相交的线、最大子数组和三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发者眼中的向量数据库应用领域

目录 引言向量数据库概念向量数据库优势应用领域亚马逊云科技向量数据库向量数据库的使用步骤最后 引言 随着人工智能和大数据技术的快速发展&#xff0c;越来越多的技术倾向于数据存储方面&#xff0c;数据库领域也随着人工智能和大数据的发展而发展&#xff0c;尤其是向量…

月销破30万辆后,比亚迪整了波大的

最近乘联会公布了 2023 年 10 月新能源乘用车厂商销量榜单。 其中最为亮眼犹如鹤立鸡群的榜首&#xff0c;没错依然是我们熟悉的那个迪子&#xff01; 单月销量超 30 万辆&#xff0c;相较去年同期暴涨 38.4%&#xff0c;创下了比亚迪有史以来新高。 同时也成为了国内首个月销…

PEFT概述:最先进的参数高效微调技术

了解参数高效微调技术&#xff0c;如LoRA&#xff0c;如何利用有限的计算资源对大型语言模型进行高效适应。 PEFT概述&#xff1a;最先进的参数高效微调技术 什么是PEFT什么是LoRA用例使用PEFT训练LLMs入门PEFT配置4位量化封装基础Transformer模型保存模型加载模型推理 结论 什…

Java学习 9.Java-数组 讲解及习题

一、数组的定义与使用 1.数组的基本概念 1.1 为什么要使用数组 数组是最简单的一种数据结构 组织一组相同类型数据的集合 数据结构本身是来描述和组织数据的 数据加结构 1.2.1 数组的创建 代码实现 new int 可省略&#xff1b; char[] chars{a,b,c};//定义一个整形类型数…

在线免费语音克隆工具,1分钟,复制你的声音

hi&#xff0c;同学们&#xff0c;我是赤辰。玩自媒体这么多年&#xff0c;总结出凡是用自己的声音做短视频&#xff0c;既有识别度&#xff0c;也更容易上热门&#xff0c;但是录制音频的艰难&#xff0c;试过的都知道&#xff0c;市面上也有很多克隆工具&#xff0c;但是基本…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

Qt——连接mysql增删查改(仓库管理极简版)

目录 UI布局设计 .pro文件 mainwindow.h main.cpp UI布局设计 .pro文件 QT core gui QT core gui sql QT sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any …

【算法-链表4】环形链表2的两种解法

今天&#xff0c;带来链表相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 环形链表 1. 思路 利用链表相交 我们在环内任意一处断开&#xff0c;然后判断断开处的下一个位置和head是否相交&#xff0c;如果相交&#xff0c;相交处就是环口。 公式法 …

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL&#xff0c;失败了。当时不知道原因&#xff0c;只能使用GeoServer来发布数据了。现在终于搞明白了&#xff0c;原因是ArcGIS10.2版本太老&#xff0c;无法连接PostgreSQL9.4。参考这里 为了适应时代的发展&#xff0c;那我就用新的Ar…

Spark的转换算子和操作算子

1 Transformation转换算子 1.1 Value类型 1&#xff09;创建包名&#xff1a;com.shangjack.value 1.1.1 map()映射 参数f是一个函数可以写作匿名子类&#xff0c;它可以接收一个参数。当某个RDD执行map方法时&#xff0c;会遍历该RDD中的每一个数据项&#xff0c;并依次应用f函…

python Flask框架,调用MobileNetV2图像分类模型,实现前端上传图像分类

python Flask框架&#xff0c;调用MobileNetV2图像分类模型&#xff0c;实现前端上传图像分类 今天博主介绍一个图像分类的小项目 基于flask 和mobileNetV2模型的前端图像分类项目 环境配置如下&#xff1a; python版本3.7.6 安装库的版本如下&#xff1a; tensorflow 2.11.…

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错

LabVIEW中NIGPIB设备与驱动程序不相关的MAX报错 当插入GPIB-USB设备时&#xff0c;看到了NI MAX中列出该设备&#xff0c;但却显示了黄色警告指示&#xff0c;并且指出Windows没有与您的设备相关的驱动程序。 解决方案 需要安装能兼容的NI-488.2驱动程序。 通过交叉参考以下有…

STM32--时钟树

一、什么是时钟&#xff1f; 时钟是单片机的脉搏&#xff0c;是系统工作的同步节拍。单片机上至CPU&#xff0c;下至总线外设&#xff0c;它们工作时序的配合&#xff0c;都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号。 二、什么是时钟树&#xff1f; S…

“Git实践指南:深入探索开发测试上线、分支管理与标签“

文章目录 引言一、Git的分支的使用1.分支2.标签3.分支与标签的关系4. 分支在实际中的作用5. 四个环境以及各自的功能特点6. 分支策略分支应用场景 二、Git的标签3.1 标签的基本使用3.3 标签的共享与推送 总结 引言 在现代软件开发中&#xff0c;版本控制是一个关键的环节&…

2023年【危险化学品经营单位主要负责人】免费试题及危险化学品经营单位主要负责人证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人免费试题为正在备考危险化学品经营单位主要负责人操作证的学员准备的理论考试专题&#xff0c;每个月更新的危险化学品经营单位主要负责人证考试祝您顺利通过危险化学品经营单位主…

【扩散模型】万字长文全面理解与应用Stable Diffusion

万字长文全面理解与应用Stable Diffusion 1. Stable Diffusion简介1.1 基本概念1.2 主体结构1.3 训练细节1.4 模型评测1.5 模型应用1.6 模型版本1.7 其他类型的条件生成模型1.8 使用DreamBooth进行微调 2. 实战Stable Diffusion2.1 环境准备2.2 从文本生成图像2.3 Stable Diffu…

LIBGDX实时绘制字符、实时绘制中文

LIBGDX实时绘制字符、实时绘制中文 转自&#xff1a;https://lingkang.top/archives/libgdx-shi-shi-hui-zhi-zi-fu 注意&#xff0c;相比于贴图字体&#xff0c;实时绘制会有一定的失真、模糊 Maven项目依赖&#xff1a; <properties><maven.compiler.source>…

抢量双11!抖音商城「官方立减」 缘何成为“爆单神器”?

10月20日抖音商城双11好物节正式开跑&#xff0c;仅仅三天&#xff0c;抖音商城整体GMV对比去年同期提升了200%&#xff0c;而在开跑一周后&#xff0c;一些品牌的销售额已经超过了今年整个618&#xff0c;可谓增势迅猛。其中&#xff0c;平台官方特别推出的「官方立减」玩法&a…

基于51单片机的篮球比赛计分器积分器

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机篮球 获取完整源程序仿真源文件原理图文件论文报告等 基于51单片机的篮球计分器 由STC89C51单片机数码管显示模块按键模块电源模块构成 具体功能&#xff1a; &#xff08;1&#xff09;能记录单节比赛的比赛时间&am…

ETW HOOK原理探析

ETW HOOK研究 文章目录 ETW HOOK研究前言原理探究内核开启ETW日志HOOK ETW修改ETW日志上下文代理GetCpuClock函数寻找SSDT和SSDT Shadow 总结参考 前言 关于ETW是什么我就不多说了&#xff0c;可以通过微软的相关文档了解到。据网上得知这项技术最早被披露于2345的驱动中&…