最长公共子序列和最长公共子串

最长公共子序列

题目描述

给出1,2,…,n 的两个排列P1 和 P2 ,求它们的最长公共子序列。

输入格式

第一行是一个数 n

接下来两行,每行为 n 个数,为自然数1,2,…,n 的一个排列。

输出格式

一个数,即最长公共子序列的长度。

题目分析

第一阶段定义dp数组

(1)考虑规模。两个序列的长度就是规模,因为是两个,所以需要两个维度来表示。

(2)考虑限制。这里的限制就是对应位置相等,可以在递推的时候进行限制。

(3)写dp数组。 d p [ i ] [ j ] dp[i][j] dp[i][j]表示的第一个序列前i个值和第二个序列前j个值对应的最长公共子序列

第二阶段推导状态转移方程

(1)如果 s 1 [ i ] = = s 2 [ j ] , d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 s1[i]==s2[j],dp[i][j]=dp[i-1][j-1]+1 s1[i]==s2[j]dp[i][j]=dp[i1][j1]+1

(1)如果 s 1 [ i ] ! = s 2 [ j ] s1[i]!=s2[j] s1[i]!=s2[j],那么我们就要从前一个状态的最大值里面转移过来,前一个状态有哪些呢? d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] dp[i-1][j],dp[i][j-1] dp[i1][j],dp[i][j1]就是它的前一个状态, d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1]不是,因为他距离 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1]已经变化了2步。 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j]=max(dp[i-1][j],dp[i][j-1]) dp[i][j]=max(dp[i1][j],dp[i][j1])

第三阶段写代码

(1)初始化。一开始长度是0。

(2)第一层for循环遍历规模,这里规模是两个维度表示的,所以也需要两层for循环。

(3)第二层for循环仍然遍历规模。

题目代码
import java.io.IOException;
import java.util.Scanner;public class Main{
public static void main(String[] args) throws NumberFormatException, IOException {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int m=n;int a[] = new int[n+1];int b[] = new int[m+1];int dp[][] = new int[n+1][m+1];for(int i = 1;i <= n;i++) a[i] = scanner.nextInt();for(int i = 1;i <= m;i++) b[i] = scanner.nextInt();for(int i = 1;i <= n;i++) {for(int j = 1;j <= m;j++) {if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}System.out.println(dp[n][m]);
}
}

在洛谷提交还是内存超限,离谱。

最长公共子串

题目分析

注意子串和子序列的差别,abcde中acd是一个子序列,但不是一个子串,abc是一个子串也是一个子序列。子串的要求要比子序列高。子串必须是连续的。那么这一点体现在哪里呢。体现在状态转移方程以及答案上。

第一阶段定义dp数组

(1)考虑规模。两个序列的长度就是规模,因为是两个,所以需要两个维度来表示。

(2)考虑限制。这里的限制就是对应位置相等,可以在递推的时候进行限制。

(3)写dp数组。 d p [ i ] [ j ] dp[i][j] dp[i][j]表示的第一个序列前i个值和第二个序列前j个值对应的最长公共子串

第二阶段推导状态转移方程

(1)如果 s 1 [ i ] = = s 2 [ j ] , d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 s1[i]==s2[j],dp[i][j]=dp[i-1][j-1]+1 s1[i]==s2[j]dp[i][j]=dp[i1][j1]+1

(1)如果 s 1 [ i ] ! = s 2 [ j ] , d p [ i ] [ j ] = 0 s1[i]!=s2[j],dp[i][j]=0 s1[i]!=s2[j]dp[i][j]=0

第三阶段写代码

(1)初始化。一开始长度是0。

(2)第一层for循环遍历规模,这里规模是两个维度表示的,所以也需要两层for循环。

(3)第二层for循环仍然遍历规模。

(4)答案。这里的 d p [ i ] [ j ] dp[i][j] dp[i][j]不一定是最终答案,答案要在过程中记录一个最大值。也就是所有dp值的最大值。 m a x ( d p [ i ] [ j ] ) max(dp[i][j]) max(dp[i][j])

题目代码
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws NumberFormatException, IOException {Scanner scanner = new Scanner(System.in);char a[];char b[];a = (" "+scanner.next()).toCharArray();b = (" "+scanner.next()).toCharArray();int n = a.length-1;int m = b.length-1;int dp[][] = new int[n+1][m+1];	int ans = 0;for(int i = 1;i <= n;i++) {for(int j = 1;j <= m;j++) {if(('0'<=a[i]&&a[i]<='9') || ('0'<=b[j]&&b[j]<='9')) continue;if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j] = 0;ans = Math.max(ans, dp[i][j]);}}System.out.println(ans);
}
}

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

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

相关文章

浅谈iPaaS对企业转型的重要性

面对数字化转型的大浪潮&#xff0c;众多企业都期望着能快速实现全面的数字化转型&#xff0c;让企业在日益激烈的竞争中拥有更稳的市场地位&#xff0c;提升自身的实力及能力&#xff0c;奠定更坚实的基底。但在数字化转型过程中&#xff0c;部分企业数字化基础水平较薄弱&…

Spring Boot注入PasswordEncoder失败

问题 以Autowired方式注入PasswordEncoder对登录密码进行校验&#xff0c;启动时报错如下 Description:Field userService in com.lyx.springboot.controller.UserController required a bean of type org.springframework.security.crypto.password.PasswordEncoder that co…

C语言:国家名称按字母表排序

题目描述 输入一个整数n(n<20)&#xff0c;表示待输入国家的数量。随后输入n个国家或地区的名称 (名称长度为1~30)&#xff0c;要求按字母顺序升序输出。 注意&#xff1a;名称中可能包含空格符。 提示 字符串比较请使用函数&#xff1a; int strcmp(const char* str1&a…

开源软件:推动软件行业繁荣的力量

文章目录 &#x1f4d1;引言开源软件的优势分析开放性与透明度低成本与灵活性创新与协作 开源软件对软件行业的影响推动技术创新和进步促进软件行业的合作与交流培养人才和提高技能促进软件行业的可持续发展 结语 &#x1f4d1;引言 随着信息技术的飞速发展&#xff0c;软件已经…

设计模式Python实现

过年在家瞎折腾&#xff0c;闲着无聊看到设计模式&#xff0c;于是就想着用Python实现一下。 简单工厂 根据传入的参数决定创建出哪一种产品类的实例。 class CashFactory:def createCashAdapter(self, type):if type "满100减20":return CashReturn(100, 20)elif…

Sora爆火,普通人的10个赚钱机会

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

Linux的命令简记

查看网络设置的命令是什么 Ifconfig 要想在PATH中添加命令要用到什么命令 PATH"$PATH":目录的绝对路径 复制文件的命令是什么 Cp 源文件 目标文件 cp命令怎么递归复制 Cp -r Cp命令怎么查询是否覆盖 Cp -i cp命令怎么把文件的权限也都复制过来 Cp -a 如果要复制目录要…

spring boot自动装配

第一步需要在pom.xml文件指定需要导入的坐标 要是没有自动提示需要检查maven有没有 实现代码 /*springboot第三方自动配置实现方法 * 什么是自动配置 自动配置就是springboot启动自动加载的类不需要在手动的控制反转自动的加入bean中 * * *//*第一种方案包扫描 不推荐因为繁琐…

2024 VNCTF----misc---sqlshark sql盲注+流量分析

流量分析 wireshark 可以看到很多 any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(80))),1,0))# P any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(104))),1,0))#…

18-k8s控制器资源-cronjob控制器

job控制器是执行完一次任务&#xff0c;就结束&#xff1b; cronjob控制器&#xff0c;是基于job控制器&#xff0c;定期频率性执行任务&#xff1b;等同于linux系统中的crontab一样&#xff1b; 1&#xff0c;编辑cronjob资源清单 [rootk8s231 pi]# vim cronjob.yaml apiVers…

mfc140u.dll文丢失导致应用程序无法正常,有哪些解决办法

mfc140u.dll是Microsoft Foundation Classes&#xff08;MFC&#xff09;的一个重要组件&#xff0c;它提供了许多用于开发Windows应用程序的功能和工具。然而&#xff0c;当系统或应用程序升级、恶意软件感染或文件损坏以及用户错误操作等情况发生时&#xff0c;mfc140u.dll文…

HarmonyOS—状态管理概述

在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#xff0c;UI从“He…

【OrangePi Zero2的系统移植】嵌入式Linux系统的组成、编译u-boot、编译内核、Linux根文件系统

一、嵌入式Linux系统的组成 二、编译u-boot 三、编译内核 四、Linux根文件系统 一、嵌入式Linux系统的组成 嵌入式Linux系统和PC完整的操作系统的对比如下&#xff1a; BIOS和UEFI的作用&#xff1a; a. 进行硬件自检&#xff0c;检测内存&#xff0c;CPU&#xff0c;显卡&a…

使用LlamaIndex和ChatGPT的无代码检索增强生成(RAG)

自从ChatGPT和类似的LLM推出以来&#xff0c;出现了大量的RAG工具和库。人们需要了解如何使用LlamaIndex和ChatGPT的无代码RAG。 检索增强生成(RAG)是使用大型语言模型(LLM)的关键工具。RAG使LLM能够将外部文档合并到它们的响应中&#xff0c;从而更紧密地与用户需求保持一致。…

Servlet要点总结

一、什么是 Servlet Servlet 在开发动态 WEB 工程中&#xff0c;得到广泛的应用&#xff0c;掌握好 Servlet 非常重要了 , Servlet( 基 石 ) 是 SpringMVC 的基础 Servlet(java 服务器小程序 ) &#xff0c;它的特点 : 1. 他是由服务器端调用和执行的 ( 一句话&…

RTC时钟

目录 一、STM32F407内部RTC硬件框图&#xff0c;主要由五大部分组成&#xff1a; 二、硬件相关引脚 三、具体代码设置步骤 四、了解其它知识点 一、STM32F407内部RTC硬件框图&#xff0c;主要由五大部分组成&#xff1a; ① 时钟源 (1)LSE&#xff1a;一般我们选择 LSE&am…

[ 2024春节 Flink打卡 ] -- 理论基础

2024&#xff0c;游子未归乡。工作需要&#xff0c;flink coding。觉知此事要躬行&#xff0c;未休&#xff0c;特记 之后&#xff0c;文档格式整理 文尾有word链接 相关代码陆续上传 Apache Flink 是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink…

3 处理机调度和死锁(下)

死锁 引起死锁&#xff1a;需要采用互斥访问的 不可以被抢占的资源&#xff08;临界资源&#xff09; 系统资源分类&#xff1a; 可重用性资源 可消耗性资源可抢占性资源 不可抢占性资源 计算机系统中的死锁 竞争不可抢占性资源引起死锁竞争可消耗资源引起死锁进程推进顺序不…

【EI稳定检索会议】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

#往届均已成功检索# 投稿时邀请码请填H8053 第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09; 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 &g…

16.Qt 工具栏生成

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 界面添加 2. 信号槽 功能实现 参考&#xff1a; 前言&#xff1a; 基于QMainWindow&#xff0c;生成菜单下面的工具栏&#xff0c;可以当作菜单功能的快捷键&#xff0c;也可以完成新的功能 直接在UI文件中…