当前位置: 首页 > news >正文

刷题之最长公共/上升子序列问题

目录

一、最长公共子序列问题(LCS)

1、题目

 2、题目解读

​编辑

 3、代码

四、多写一题

五、应用

二、最长上升子序列问题(LIS)

1、题目

 2、题目解读

 3、代码

四、多写一道

 Ⅰ、题目解读

 Ⅱ、代码

一、最长公共子序列问题(LCS)

最长公共子序列LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。

1、题目

最长公共子序列

我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。
例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。
现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度。

 

输入描述:

输入包含多组数据。
每组数据包含两个字符串m和n,它们仅包含字母,并且长度不超过1024。
 

输出描述:

对应每组输入,输出最长公共子序列的长度。

示例1

输入

abcfbc abfcab
programming contest
abcd mnp

输出

4
2
0

 2、题目解读

如题所示,题目会给我们两个字符串,要求我们去寻找最长的公共子序列。下面我举ABCBDABBDCABA这个例子,我们先用肉眼发现一下有三个长度都是四的子序列。

这是一个非常经典的动态规划题,我也废话不多说,接下来直接说解决这个问题最常见的方法:创建一个二维数组dp[][],用dp[i][j]来存储s1前i个字符和s2前j个字符的LCS数,我们想一下dp[i][j]和dp[i+1][j+1]有什么关系,发现 假如s1ᵢ₊₁ 字符和s2 ⱼ₊₁字符相同,则

dp[i+1][j+1]=dp[i][j]+1,如果s1ᵢ₊₁ 字符和s2 ⱼ₊₁字符不相同,则

dp[i+1][j+1]=Max(dp[i+1][j],dp[i][j+1])。可以查看下方s1和s2的dp[][]图。说到这里代码也就出来了

 3、代码


import java.util.Scanner;public class Main {public static int MaxLength(String s1, String s2) {int m = s1.length();int n = s2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (s1.charAt(i - 1) == s2.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[m][n];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String s = sc.nextLine();String[] ss = s.split(" ");System.out.println(MaxLength(ss[0], ss[1]));}}
}

四、多写一题

最长公共子序列(二)_牛客题霸_牛客网 (nowcoder.com)

 这题和一一样创建一个数组保存s1和s2的LCS,只不过不一样的是,这次保存的是String,是字符串,思路都是一样的。可以看下面代码基本上没改什么。

import java.util.Scanner;public class 最长公共子序列2 {public static String LCS(String s1, String s2) {int m = s1.length();int n = s2.length();//int[][] dp = new int[m+1][n+1];String[][] s=new String[m+1][n+1];for (int i=0;i<=n;i++){s[0][i]=" ";}for (int i=0;i<=m;i++){s[i][0]=" ";}for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++){if(s1.charAt(i - 1) == s2.charAt(j - 1)){//dp[i][j] = dp[i - 1][j - 1] + 1;s[i][j]=s[i-1][j-1].concat(String.valueOf(s1.charAt(i-1)));}else{//dp[i][j] = Math.max(dp[i - 1][j],dp[i][j - 1]);s[i][j]=s[i-1][j].length()>s[i][j-1].length()?s[i-1][j]:s[i][j-1];}}}if (s[m][n].equals(" "))return "-1";return s[m][n].trim();}}

五、应用

最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。

二、最长上升子序列问题(LIS)

最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。

1、题目

最长上升子序列

 2、题目解读

题目要求我们求最长上升子序列的长度。还是先举一个例子271564389,可以很容易得出这个序列的各个数的最长上升子序列。我们还是思考dp[i]和dp[i-1]的关系,即当sᵢ >sᵢ₋₁时,

 dp[i]=Max(dp[i-1]+1,dp[i]),比如上面的6,在遍历到5之前dp[4]=2,遍历到5时dp[4]=dp[3]+1=3;dp[]数初始化为1,上面的1,前面没有比1小的数,所以还是1。当sᵢ<sᵢ₋₁时,就像上面的1一样,不用进行变化。

 3、代码

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int n= sc.nextInt();int[] arr=new int[n];int[] dp=new int[n];//初始化数组都为1,表示第i个数本身Arrays.fill(dp,1);for (int i=0;i<n;i++){arr[i]=sc.nextInt();}int max=0;for(int i=0;i<n;i++){for(int j=0;j<i;j++){if(arr[j]<arr[i]&&dp[j]+1>dp[i])dp[i]=dp[j]+1;}max=Math.max(dp[i],max);}System.out.println(max);}}
}

四、多写一道

和唱队列

描述

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入

输入的第一行是一个整数N(2 <= N <= 100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。

输出

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

样例输入

8
186 186 150 200 160 130 197 220

样例输出

4

 Ⅰ、题目解读

题目会给我们n个人的身高,要求我们找出要至少多少人出列这些人的身高才可以形成下面坡状(中间高两边矮)。

 这也是一个最长上升子序列问题,只不过前面的都是从左边向右边找,这次即要从左边向右边找也要从右边向左找,然后计算出哪个人的左子序列+右子序列-1最大(加了两次自己,所以要-1)。

 所以样例输出为8-5+1=4

 Ⅱ、代码

import java.util.Scanner;public class Main{public static void main(String[]args){Scanner sc=new Scanner(System.in);while(sc.hasNext()){int n=sc.nextInt();int[]num=new int[n];//存储n位同学的身高int []left=new int[n];//存储左侧最长递增子序列的元素个数int []right=new int[n];//存储右侧最长递增(从右向左看)子序列的元素个数for(int i=0;i<n;i++){num[i]=sc.nextInt();//对于每一个同学num[i]来说,左(右)侧最长递增子序列只有一个元素(就是本身)left[i]=1;right[i]=1;}//左子序列for(int i=0;i<n;i++)//固定某个学生num[i]不变{for(int j=0;j<i;j++)//依次遍历该学生左侧的每个学生{if(num[j]<num[i]&&left[j]+1>left[i])//当学生j的身高比学生i矮,并且满足递增性时,left[i]增加left[i]=left[j]+1;}}//右子序列//右侧与左侧同理for(int i=n-1;i>=0;i--){for(int j=n-1;j>i;j--){if(num[j]<num[i]&&right[j]+1>right[i])right[i]=right[j]+1;}}int max=0;//对于每个学生i而言,左侧最长递增序列元素个数和左侧最长递增序列元素个数和最大时该数目就是合唱队的最多人数+1for(int i=0;i<n;i++){if(left[i]+right[i]>max){max=left[i]+right[i];}}System.out.println(n-max+1);//由于被固定的学生i被数了两次(左侧和右侧各一次),所以+1}}
}

相关文章:

刷题之最长公共/上升子序列问题

目录 一、最长公共子序列问题&#xff08;LCS&#xff09; 1、题目 2、题目解读 ​编辑 3、代码 四、多写一题 五、应用 二、最长上升子序列问题&#xff08;LIS&#xff09; 1、题目 2、题目解读 3、代码 四、多写一道 Ⅰ、题目解读 Ⅱ、代码 一、最长公共子序列问题&…...

【数据结构】千字深入浅出讲解栈(附原码 | 超详解)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;C语言实现数据结构 &#x1f4ac;总结&#xff1a;希望你看完…...

自动驾驶V2X

1 SoC MDM9250 2 设备网络节点 mhi_swip0 rmnet_mhi0 3 网络协议栈log打印控制 include/linux/netdevice.h ethtool -s eth0 msglvl [level] ethtool -s eth0 msglvl 0x6001 4 URLs MHI initial design review https://lore.kernel.org/lkml/001601d52148$bd852840$388f78c0$c…...

零基础自学网络安全/渗透测试有哪些常见误区?

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…...

ConvMixer:Patches Are All You Need

Patches Are All You Need 发表时间&#xff1a;[Submitted on 24 Jan 2022]&#xff1b; 发表期刊/会议&#xff1a;Computer Vision and Pattern Recognition&#xff1b; 论文地址&#xff1a;https://arxiv.org/abs/2201.09792&#xff1b; 代码地址&#xff1a;https:…...

day10—编程题

文章目录1.第一题1.1题目1.2思路1.3解题2.第二题2.1题目2.2涉及的相关知识2.3思路2.4解题1.第一题 1.1题目 描述&#xff1a; 给定一个二维数组board&#xff0c;代表棋盘&#xff0c;其中元素为1的代表是当前玩家的棋子&#xff0c;0表示没有棋子&#xff0c;-1代表是对方玩…...

如何测量锂电池的电量

锂电池在放电时我们有时需要知道电池的实时电量&#xff0c;如电池电量低了我们就需要及时给锂电池充电&#xff0c;避免电池过度放电。我手里的这个就是个单节锂电池电量显示模块&#xff0c;只需要将这个模块接到锂电池的正负极即可显示电量。这个模块的电量分为四档&#xf…...

菜鸟刷题Day6

⭐作者&#xff1a;别动我的饭 ⭐专栏&#xff1a;菜鸟刷题 ⭐标语&#xff1a;悟已往之不谏&#xff0c;知来者之可追 一.链表内指定区间反转&#xff1a;链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转…...

DecimalFormat格式化显示数字

DecimalFormat 是 NumberFormat 的一个具体子类&#xff0c;用于格式化十进制数字&#xff0c;可以实现以最快的速度将数字格式化为你需要的样子。 DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充&#xff0c; # 表示只要有可能就…...

cpu中缓存简介

一级缓存是什么&#xff1a; 一级缓存都内置在CPU内部并与CPU同速运行&#xff0c;可以有效的提高CPU的运行效率。一级缓存越大&#xff0c;CPU的运行效率越高&#xff0c;但受到CPU内部结构的限制&#xff0c;一级缓存的容量都很小。 CPU缓存&#xff08;Cache Memory&#xf…...

【数据结构】二叉树的遍历以及基本操作

目录 1.树形结构 1.概念 2.二叉树 2.1概念 2.2 两种特殊的二叉树 2.3二叉树的存储 2.4二叉树的基本操作 1.手动快速创建一棵简单的二叉树 2.二叉树的遍历 (递归) 3.二叉树的层序遍历 4.获取树中节点的个数 5.获取叶子节点的个数 6.获取第K层节点的个数 7.获取二叉…...

若依框架 --- ruoyi 表格的设置

表格 字典值转换 (1) 方式1&#xff1a;使用字典枚举的方式 var isDownload [[${dict.getType(YES_OR_NO)}]];{field : isDownload,title : 是否允许下载,formatter: function(value, row, index) {return $.table.selectDictLabel(isDownload, value);} }, (2) 方式2&…...

“两会”网络安全相关建议提案回顾

作为新一年的政治、经济、社会等发展的“风向标”&#xff0c;今年“两会”在3月13日顺利闭幕。在今年“两会”期间&#xff0c;多位人大代表也纷纷围绕网络安全、数据安全的未来发展做了提案和建议。 01 “两会”网络安全相关建议和提案回顾 建议统筹智能网联汽车数据收集与共…...

一篇文章带你真正了解接口测试(附视频教程+面试真题)

目录 一、什么是接口测试&#xff1f; 二、为什么要做接口测试&#xff1f; 三、如何开展接口测试&#xff1f; 四、接口测试常见面试题 一、什么是接口测试&#xff1f; 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据…...

C/C++每日一练(20230325)

目录 1. 搜索插入位置 &#x1f31f; 2. 结合两个字符串 &#x1f31f; 3. 同构字符串 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 搜索插入位置 给定一个排序数…...

Linux操作系统ARM指令集与汇编语言程序设计

一、实验目的1.了解并掌握ARM汇编指令集2.应用ARM指令集编写一个程序操控开发板上的LED灯二、实验要求应用ARM汇编指令集编写程序&#xff0c;实现正常状态下开发板上的LED灯不亮&#xff0c;按下一个按键之后开发板上的LED灯进入流水灯模式。三、实验原理四个LED灯的电路如下图…...

计网之HTTP协议和Fiddler的使用

文章目录一. HTTP概述和fidder的使用1. 什么是HTTP2. 抓包工具fidder的使用2.1 注意事项2.2 fidder的使用二. HTTP协议格式1. HTTP请求格式1.1 基本格式1.2 认识URL1.3 方法2. 请求报头关键字段3. HTTP响应格式3.1 基本格式3.2 状态码一. HTTP概述和fidder的使用 1. 什么是HTT…...

sql性能优化:MS-SQL(SQL Server)跟踪日志信息结果列字段说明,MSSQL的列字段说明(column)

sql性能优化&#xff1a;MS-SQL&#xff08;SQL Server&#xff09;跟踪日志信息结果列字段说明&#xff0c;MSSQL的列字段说明&#xff08;column&#xff09; 参考&#xff1a; SQL:BatchCompleted 事件类 | Microsoft Learn SQL 跟踪 | Microsoft Learn sp_trace_setevent (…...

DNS主从复制

#前提准备&#xff1a;关闭SElinux 关闭防火墙 时间同步 #环境说明&#xff1a;Centos7 #ip地址&#xff1a;dns-master&#xff1a;10.0.0.100 dns-slave&#xff1a;10.0.0.103 web&#xff1a;10.0.0.101 主DNS服务配置 1.安装软件包&#xff1a; yum install bind -…...

常见的js加密/js解密方法

常见的js加密/js解密方法 当今互联网世界中&#xff0c;数据安全是至关重要的。为了保护用户的隐私和保密信息&#xff0c;开发人员必须采取适当的安全措施。在前端开发中&#xff0c;加密和解密技术是一种常见的数据安全措施&#xff0c;其中 JavaScript 是最常用的语言之一。…...

6 python函数

函数 在实现某个功能对应的代码的时候&#xff0c;如果将实现功能对应的函数放到函数中&#xff0c;那么下一次再需要这个功能的时候&#xff0c;就可以不用再写这个功能对应的代码&#xff0c;直接调用这个功能对应的函数。 1.什么是函数 函数就是实现某一特点功能的代码的封装…...

7.避免不必要的渲染

目录 1 组件更新机制 2 虚拟DOM配合Diff算法 3 减轻state 4 shouldComponentUpdate() 4.1 基本使用 4.2 使用参数 5 纯组件 5.1 基本使用 5.2 纯组件的比较方法 shallow compere 1 组件更新机制 当父组件重新渲染时&#xff0c;父组件的所有子组件也会重新…...

国产化大趋势下学习linux的必要性

由于国际上的一些国家的制裁和威胁。最近几年国产化大趋势慢慢的兴起&#xff0c;我们国产化硬件的需求越来越大。对国产操作系统的需求也越来越多&#xff0c;那么我们一直用的Windows系统为什么不用了呢&#xff1f;众所周知的原因&#xff0c;不管是最新的Windows11还是正值…...

浅谈虚树

问题引入 你是否遇到过下面这种问题&#xff1a; SDOI2011 消耗战 在一场战争中&#xff0c;战场由 nnn 个岛屿和 n−1n-1n−1 个桥梁组成&#xff0c;保证每两个岛屿间有且仅有一条路径可达。现在&#xff0c;我军已经侦查到敌军的总部在编号为1的岛屿&#xff0c;而且他们已…...

裸机条件下写一个基于时间片轮转的多任务并发程序

目录前言A. 使用RTOSB.裸机多任务并发前言 在学习各种MCU的时候&#xff0c;都是用在main函数里写一个while(1){/* 执行代码 */}&#xff0c;这种方式只能一个函数运行完以后再运行另一个函数。 假设需求控制多个模块&#xff0c;如显示屏幕信息的同时控制电机&#xff0c;还要…...

RK3588 系统定制开关机动画

平台&#xff1a;ITX-3588J, ROC-RK3588S-PC 系统&#xff1a;Android12.0 作者&#xff1a;jpchen & zzz 一. 功能描述 定制自己的开机动画和关机动画 二. 功能实现 1.开启功能 修改device/rockchip/common/BoardConfig.mk文件 BOOT_SHUTDOWN_ANIMATION_RINGINGtrue2.…...

水文-编程命令快查手册

前言 脑子里面记不住一些命令&#xff0c;每次遇到都得查下。我经常在三个实体电脑&#xff0c;windows/uos/ubuntu不同系统上编程。 所以web版本的笔记查看起来方便点。这里报错下。 二级标题 cmake windows在cmake --build的时候&#xff0c;使用–config&#xff0c;指定…...

如何优雅编写测试用例

当你学会了如何设计测试用例之后&#xff0c;接下来便是开始用例的编写。 在设计阶段&#xff0c;更准确的说应该是识别测试点的过程&#xff0c;而编写阶段则是将测试点细化成一条条测试用例的过程&#xff0c;有了比较全的用例场景后&#xff0c;如何让别人更舒服、更方便、…...

[入门必看]数据结构2.3:线性表的链式表示

[入门必看]数据结构2.3&#xff1a;线性表的链式表示第二章 线性表2.3 线性表的链式表示知识总览2.3.1 单链表的定义2.3.2_1 单链表的插入删除2.3.2_2 单链表的查找2.3.2_3 单链表的建立2.3.3 双链表2.3.4 循环链表2.3.5 静态链表2.3.6 顺序表和链表的比较2.3.1 单链表的定义单…...

Golang流媒体实战之二:回源

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 今天的实战是流传输过程中的常见功能&#xff1a;回源如下图&#xff0c;lal(源站)和lal(拉流节点)代表两台电脑&#xff0c;上面都部署了lalVLC在…...

网站内链优化策略/百度手机助手安卓版下载

YOLO v3整体是一个106层的全卷积网络&#xff0c;包括了残差模块&#xff0c;上采样模块&#xff0c;检测模块。 1.Get darknet 代码 $ git clone https://github.com/pjreddie/darknet 我们暂时先不开GPU&#xff0c;先做推理&#xff0c;安装GPU环境是一个痛苦的过程&…...

山东德州网站建设哪家最专业/站长统计在线观看

APP的首页App.js里&#xff0c;根据logFlag的值来判断渲染的内容是登录页面还是首页&#xff1a; http://blog.csdn.net/black_dreamer/article/details/51902362 以前的逻辑是在MyInfo.js文件里的注销按钮里设置isLogin为false&#xff0c;然后跳转到App.js&#xff0c;App.…...

做网站做得好的公司有哪些/百度广告联盟点击一次多少钱

题目描述把只包含因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。例如6、8都是丑数&#xff0c;但14不是&#xff0c;因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路&#xff1a;有p<q, 那么2*p<2*q&#xff0c;…...

网站制作布局/线上推广的三种方式

OpenGL ES 03 – 转化今天&#xff0c;我们要在之前的基础 上&#xff0c;在屏幕上同时显示三角形和矩形。为了做到这点&#xff0c;我们需要移动它们。移动物体这个动作我们称之为转化。&#xff08;坐标转换&#xff09;在OpenGL ES中&#xff0c;对模型&#xff0f;物体进行…...

柘城县网站建设/长沙建站seo公司

网站的可扩展性架构设计&#xff0c;能够在对现有系统影响最小的情况下&#xff0c;系统功能可以可持续扩展及提升的能力。 在此&#xff0c;对容易混为一谈的 “扩展性” 和 “伸缩性” 的概念进行详细说明&#xff1a; 扩展性 表现为&#xff1a;基础设施不需要经常变更&…...

网络网站建设办公/如何做宣传推广营销

elasticsearch kibana使用说明 kibana是一个开源的可视化分析平台&#xff0c;常用于处理elasticsearch中的数据&#xff0c;可用图表等形式直观地展现数据 **************************** 配置文件 server.name: kibana server.port: 5601#连接的elasticsearch信息 elasticsea…...