[动态规划]最长公共子序列

题目六 最长公共子序列

题目描述

我们称一个字符的数组S为一个序列。对于另外一个字符数组Z,如果满足以下条件,则称Z是S的一个子序列:(1)Z中的每个元素都是S中的元素(2)Z中元素的顺序与在S中的顺序一致。例如:当S = (E,R,C,D,F,A,K)时,(E,C,F)和(E,R)等等都是它的子序列。而(R,E)则不是。
现在我们给定两个序列,求它们最长的公共子序列的长度。

关于输入

一共两行,分别输入两个序列

关于输出

一行,输出最长公共子序列的长度。

例子输入
ABCBDAB
BDCABA
例子输出
4
解题分析

这个问题的具体描述是:给定两个序列,求它们的最长公共子序列的长度。

程序的主要思路如下:

  1. 首先,程序读取两个字符串,存储在word1word2中,然后计算它们的长度len1len2

  2. 然后,程序初始化一个二维数组dpdp[i][j]表示word1的前i个字符和word2的前j个字符的最长公共子序列的长度。

  3. 程序遍历所有可能的ij(从0到len1len2)。

    • 如果ij为0,那么dp[i][j]就等于0,因为空字符串与任何字符串的最长公共子序列的长度都是0。

    • 如果word1[i-1]等于word2[j-1],那么dp[i][j]就等于dp[i-1][j-1] + 1。这是因为,当前的字符可以加入最长公共子序列。

    • 如果word1[i-1]不等于word2[j-1],那么dp[i][j]就等于dp[i][j-1]dp[i-1][j]中的较大值。这是因为,当前的字符不能同时加入最长公共子序列,所以我们只能选择一个。

  4. 最后,dp[len1][len2]就是word1word2的最长公共子序列的长度。

这个程序的时间复杂度是O(n^2),因为它需要遍历所有可能的ij。如果字符串的长度非常大,那么这个程序可能会运行得比较慢。

代码实现
#include <iostream>
#include <cstring>
using namespace std;int dp[10005][10005];
char word1[10005],word2[10005];int main() {cin>>word1>>word2;int len1=strlen(word1),len2=strlen(word2);for(int i=0;i<=len1;i++)for(int j=0;j<=len2;j++){if(i==0 || j==0){dp[i][j]=0;}else{if(word1[i-1]==word2[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}}cout<<dp[len1][len2]<<endl;return 0;
}
使用记忆搜索法解决问题
#include <iostream>
#include <cstring>
using namespace std;int dp[10005][10005];
char word1[10005],word2[10005];int f(int i,int j){if(i==0 || j==0){return 0;}if(dp[i][j]){return dp[i][j];}if(word1[i-1]==word2[j-1]){dp[i][j]=f(i-1,j-1)+1;}else{dp[i][j]=max(f(i-1,j),f(i,j-1));}return dp[i][j];
}int main() {cin>>word1>>word2;int len1=strlen(word1),len2=strlen(word2);cout<<f(len1,len2)<<endl;return 0;
}

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

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

相关文章

22 FlexSPI—读写外部 SPI NorFlash

文章目录 22.1 SPI 协议简介22.1.1 SPI物理层22.1.2 协议22.1.3 CPOL/CPHA 及通讯模式22.1.4 扩展 SPI 协议22.1.5 SDR 和 DDR 模式 22.2 RT1052 的 FlexSPI 特性及架构22.2.1 RT1052 的 FlexSPI 外设简介22.2.2 RT1052 的 FlexSPI 架构剖析22.2.2.1 通讯引脚22.2.2.2 指令查找…

如何将html网页免费转为excel?

一、直接复制。 直接复制是最简单有效、快捷的解决方案&#xff0c;操作方法如下&#xff1a; 1、用鼠标像平常复制文本一样&#xff0c;将整个网页表格选中。 2、点击右键&#xff0c;点击“复制”。 3、打开excel软件&#xff0c;鼠标点击任意单元格。 4、点击右键&#…

Power BI - 5分钟学习拆分列

每天5分钟&#xff0c;今天介绍Power BI拆分列功能。 什么是拆分列&#xff1f; 有时导入Power BI的数据表中&#xff0c;某列内容都包含同样的特殊字符如 /&/-/_等&#xff0c;可以利用这个特殊字符进行拆分列的操作&#xff0c;获得我们想要的信息。 操作举例&#xf…

【从编译器的角度看多态的底层实现原理】

系列文章目录 欢迎读者订阅《计算机底层原理》、《从JVM看Java》系列文章、能够帮助到大家就是对我最大的鼓励&#xff01; 文章目录 目录 系列文章目录 文章目录 前言 一、编译器做了什么&#xff1f; 1.词法分析 2.语法分析 3.语义分析 4.中间代码生成 5.优化 6.目标代码生成…

SugarCRM 任意文件上传漏洞复现(CVE-2023-22952)

0x01 产品简介 SugarCRM是美国SugarCRM公司的一套开源的客户关系管理系统(CRM)。该系统支持对不同的客户需求进行差异化营销、管理和分配销售线索,实现销售代表的信息共享和追踪。 0x02 漏洞概述 SugarCRM index.php接口存在安全漏洞,该漏洞源于安装组件中存在授权绕过和P…

在线人数(oj题)

题目不少于5个字&#xff0c;所以整了个括号凑字数 首先我想到的是用一个数组来记录每一秒的在线人数 但是即使是short类型&#xff08;2字节&#xff09;&#xff0c;也会用到60 * 60 * 24 * 30 * 12 * 60 * 2 / 1024 / 1024 3,559.5703125 MB 而题目上限是256MB&#xff0…

UE小:UE5性能分析

开始录制性能追踪 要开始录制性能追踪&#xff0c;您可以简单地点击界面上的“开始录制”按钮。 查看追踪数据 录制完成后&#xff0c;点击“Trace”菜单中的“UnrealInsights”选项来查看追踪数据。 使用命令行进行追踪 如果点击录制按钮没有反应&#xff0c;您可以通过命令…

【头歌系统数据库实验】实验4 MySQL单表查询

目录 第1关. 在users表中新增一个用户&#xff0c;user_id为2019100904学号&#xff0c;name为2019-物联网-李明 第2关. 在users表中更新用户 user_id为robot_2 的信息&#xff0c;name设为 机器人二号 第3关. 将solution表中所有 problem_id 为1003 题目的解答结果&#xf…

python源码,在线读取传奇列表,并解析为需要的JSON格式

python源码&#xff0c;在线读取传奇列表&#xff0c;并解析为需要的JSON格式 [Server] ; 使用“/”字符分开颜色&#xff0c;也可以不使用颜色&#xff0c;支持以前的旧格式&#xff0c;只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务…

使用医学数据集MIMIC,常见的问题记录

目录 MIMIC数据库安装及数据导入教程1.postgresql安装第一步&#xff1a;error running考虑到是不是不同的sql的冲突从报错信息出发重启之后可以安装了 2.打开navicate153.7z 不是内部或外部命令&#xff0c;也不是可运行的程序4.在postgreSQL中输入**\i xxx**命令后遇到提示pe…

2023年9月26日 Go生态洞察:深入解析类型参数

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

2023第十二届“认证杯”D题:CMOS黄昏系数|数学中国数学建模国际赛(小美赛)| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;数维杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 来看看认证杯&#xff08;D题&#xff09;&#xff01; 完整内容可以在文章末尾领取&#xff01; 问题重述&#x…

【小红书运营指南1】赛道选择 + 账号运营全周期

小红书运营指南1 写在最前面11.23标签一级标签二级标签 网络资源整理1. 赛道选择近2年小红书女性人群画像 2. 基础认知阶段3. 账号启动阶段4. 选题规划阶段5. 爆款打造阶段6. 涨粉变现阶段涨粉变现阶段粉丝发展阶段 写在最前面 最近做的一个项目调研&#xff0c;调研和实际有一…

每日移到算法题 1

借鉴文章&#xff1a;Java-敏感字段加密 - 哔哩哔哩 题目描述 给定一个由多个命令字组成的命令字符串&#xff1b; 1、字符串长度小于等于127字节&#xff0c;只包含大小写字母&#xff0c;数字&#xff0c;下划线和偶数个双引号 2、命令字之间以一个或多个下划线_进行分割…

设计模式-工厂模式(Factory)

Factory模式是一种创建型设计模式&#xff0c;用于封装对象的实例化过程。它提供了一个统一的接口来创建不同类型的对象&#xff0c;而无需暴露具体的实例化逻辑给客户端。 #include <iostream> #include <memory>// AbstractProduct&#xff08;抽象产品类&#…

mybatis-plus处理blob字段

转载自&#xff1a;www.javaman.cn 在 Spring Boot 项目中使用 MyBatis-Plus 处理 longblob 字段时&#xff0c;我们可以按照以下步骤进行操作。假设 longblob 存储的是字符串数据。以下是完整的示例代码&#xff1a; 添加依赖&#xff1a;在你的项目的 pom.xml 文件中添加 My…

js判断上传的文件是GBK编码还是UTF-8

1、获取文件二进制数据&#xff0c;这里只做示例&#xff0c;例如element-ui中文件上传的beforeUpload方法&#xff0c;返回的file对象&#xff0c;然后使用FileReader对其进行转换&#xff0c;再进行后续判断 function beforeUpload(file: File) { const reader new FileRea…

Linux基本指令(超详版)

Linux基本指令&#xff08;超详版&#xff09; 1. ls指令2.pwd指令3. cd 指令4.touch指令5mkdir指令6.rmdir指令&&rm指令7.man指令7.cp指令8.mv指令9.echo指令10.cat指令11.more指令12.less指令13.head指令14.tail指令15.date指令16.find指令17.grep指令zip(打包压缩) …

JVM类加载器ClassLoader的源码分析

1、ClassLoader与现有类加载器的关系 ClassLoader与现有类加载器的关系&#xff1a; ClassLoader是一个抽象类。如果我们给定了一个类的二进制名称&#xff0c;类加载器应尝试去定位或生成构成定义类的数据。一种典型的策略是将给定的二进制名称转换为文件名&#xff0c;然后去…

C语言--实现一个函数把一个整数转为它对应的十六进制的字符串

一.题目描述 实现一个函数把一个整数转为它对应的十六进制的字符串。 比如&#xff1a;输入数字1234 输出&#xff1a;4D2 二.思路分析 用一个sprintf函数可以解决问题&#xff0c;输出相对应的字符串 要注意的问题就是&#xff1a;函数结束后要继续使用的内存&#xff08;比如…