最长公共子序列(LCS)

详解最长公共子序列问题(三种方法) C++分别利用三种动态规划解决最长公共子序列问题 阅读详情

问题描述:给定两个字符串s1s2...sn和t1t2...tn。求出这两个字符串最长的公共子序列的长度。字符串s1s2...sn的子序列指可以表示为Si1Si2...Sim(i1<i2<...<im)的序列。

限制条件

1<=n,m<=1000

样例

输入

n=4

m=4

S="abcd"

T="becd"

输出

3(“bcd”)

分析:

设置一个二维数组,dp[n+1[n+1],当检查到Si+1与Ti+1时,有以下三种情况:

1.相等,则在dp[i+1][j+1]中赋dp[i][j]+1。

2.不相等,则S1到Si+1和T1到Ti+1对应的公共子序列是S1...Si和T1...Tj+1或者S1...Si+1和T1...Tj的子序列。此时dp[i+1][j+1]应赋值为max(dp[i][j+1],dp[i+1][j])

另外,在给出S和T的时候,我认为m是没有用处的,m必须与n同值,否则无法保证结果的长度正确。

代码如下:

 

#include<algorithm>
#include<iostream>
using namespace std;
int n, m;//n为实例字符串长度,m为子序列长度,个人认为m没有一点用处
char s[1000], t[1000];//字符串
int dp[1001][1001];//记忆化数组,为最大值加1防止溢出
void solve()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (s[i + 1] == t[j + 1])
			{
				dp[i + 1][j + 1] = dp[i][j] + 1;//如果相等,则加一
			}
			else
			{
				dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j]);
			}
		}
	}
	cout << dp[n][m];
}

 

 

 

 

 

【Python】最长公共子序列LCS LCS的定义 最长公共子序列,即Longest Common Subsequence,LCS。 一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列; 两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列。 字符串13455 与245576的最长公共子序列为455 字符串acdfg与adfc的最长公共子序列为adf 注意区别最长公共子串(Longest C... 阅读详情

相关推荐

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

先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC。这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的。假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序

小梦馆 4592

三个序列的最长公共子序列

问题描述 给定三个长度不超过200的整数序列X,Y,Z,求他们的最长公共子序列。序列中的数字均为10000以内的正整数。 例如:下列三个序列的最长公共子序列长度为4,为<1,3,9,15>。 X=<1,3,5,7,9,11,13,15> Y=<0,1,3,6,9,12,15,18> Z=<1,2,3,4,9,10,15,20> 输入格式 ...

Akid小李的博客 2022

最长公共子序列——LCS(c/c++ 伪代码)

给定两个序列 X,Y,求X和Y的长度最长的公共子序列 背包二维,一维优化

THOOOR的博客 3635

【LeetCode】【总结】 三大子序列最值问题(最长公共子序列、最长上升子序列、最长回文子序列)

做力扣的时候发现都可以用动态规划的方法解决上述三个子序列问题,并且发现三者之间有些关联。下面先挨个分析各个问题: 1、最长公共子序列 如下图所示,这是两个字符串,从中找出之间的公共子序列。 则最长公共子序列为: 我们可以通过动态规划的方法解决问题,重点就是如何原问题分解成子问题,我们发现如果两个字符串的最后一个字符相等,即str1[i] = str2[j],那么我们可以将其分...

每天进步一点点 851

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

LCS问题描述 定义:最长公共子序列(Longest Common Subsequence),即定义两个序列X和Y,求X和Y的最长公共子序列(子序列:一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列) 例如:字符串13455与245576的最长公共子序列为455 LCS的意义:LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。 LCS解法的探索...

bohenmian的博客 656

Algorithm LCS最长公共子序列

算法: 递归法:对于序列A[0,n]]和B[0,m],LCS(A,B)无非三种情况 若A或B为空,则取作空序列,作为递归基 如果末字符相等,即A[n]=B[m]=‘X’,则取LCS(A[0,n),B[0,m))+‘X’,如果前者可以求解,则问题的规模被缩小 如果末字符不相等,即A[n]!=B[m],比如A[n]=a,B[m]=b,则a和b至多有一个会出现在最后的解里(对解有贡献)。因为...

A land whole of flowers. 304

动态规划3:最长公共子序列

首先我们来区分一下子序列和子串: 子串是连续的,子序列是一个字符串中删除若干元素后形成的(两个元素前后相对顺序不变) 子序列包含子串 例:str = abcdefg 子串:cde 子序列:acf 问题 F: 最长公共子序列 题目描述 一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" , 顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串长度 输入 第一行两个字符串用空格分开。两个串的长度均小于2000 。 输出.

weixin_58346595的博客 1290

最长公共子序列问题动态规划解决,二个或者三个字符串的

哈工大算法实验二,最长公共子序列问题,动态规划解决LCS 1.实现基于优化子结构的递归求解算法 2.实现基于动态规划的求解算法 3.实现三个字符串最长公共子序列的动态规划算法 4.有界面源代码和实验报告!均为自己所做,正确运行。报告中还有用Excel表分析了算法的性能

三个字符串的最长公共子序列

这个问题是最简单的动态规划问题了,只不过是三个字符串而已。         学过动态规划的应该都知道怎么求两个字符串的最长公共子序列,很容易犯的一个错误就是:先求出前两个字符串的最长公共子序列,然后再求他和第三个字符串的最长公共子序列。举个简单的例子,三个字符串分别为abc、cab、c,前两个的最长公共子序列为ab,ab和c的公共子序列为空,实际上他们都有一个字符c,所以这种做法是错误的。

Hot Will的专栏 7220

Windows升级保留个人文件和应用灰色?改注册表版本指纹

Windows 升级安装并非简单跳过下一步,安装程序会先读取注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 EditionID、ProductName、CompositionEditionID 等版本指纹,与目标镜像 install.wim/esd 记录的版本类型做双向匹配。若当前系统被识别为 LTSC、精简版或跨版本降级,兼容性扫描会判定升级路径不可用,于是“保留个人文件和应用”变灰,只能全新安装。理解版本指纹与升级可行性表的匹配机制,可

weixin_31986143的博客 380

DIY一个SM2262ENG 2TB Nvme固态硬盘,慧荣SM2262EN主控

网友订做的 材料: 慧荣科技的62en,2片1G 三星DDR4缓存,4颗PF29F04T2AOCTH1,8CE B17A。SM2262EN属于慧荣第二代PCIe SSD主控,支持PCIe G3×4通道和全新的NVMe 1.3规范、8个NAND通道设计,并提供完整固件设计,最大循序读取速度高达3.5GB/s,循序写入速度达3.0GB/s,随机读写则高达420K IOPS和420K IOPS。此外,还采用目前最先进的低功耗设计,无论是在待机还是在工作状态下,均展现超低功耗,有效减少30%的功耗,满足用户追求超

m0_55207244的博客 1万+

最长公共子序列(LCS)

一、概念1.给定字符串str = "ABCDADNENXY"    子序列:从str中任意去掉若干个(含0个)字符,剩下的就是这个str的子序列,如ABC, ABXY, DADXY等,中间不必连续.    子串:和子序列不同,子串必须是连续的,如ABCD,ENXY,CDADNE都是子串,而AXY不是,因为中间断开了,把连续.    子串必定是子序列,子序列不一定是子串.2.最长公共子序列(Long...

tensory的博客 2万+

航空发动机轴承故障诊断

《航空发动机主轴承故障诊断的挑战与HIT数据集研究》 摘要: 航空发动机主轴承作为关键部件,其可靠性直接影响飞行安全。然而,主轴承故障诊断面临信号信噪比低、传输路径复杂、故障类型多样、变工况运行等挑战。哈尔滨工业大学团队开发的HIT数据集为研究提供了真实工况下的实验数据,包含正常、内圈和外圈故障三种状态,具有高仿真度和强挑战性特点。研究表明,传统诊断方法在该数据集上准确率仅71-85%,突显了诊断难度。团队提出的ISONet新方法通过输入空间过参数化技术,将诊断准确率提升至99%以上,为航空发动机轴承故障诊

tyutwuxuan的博客 996

动态规划-求最长公共子序列LCS长度-输出所有的最长公共子序列LCS-Java实现

题目:给定两个序列X={x1,x2,…xm},Y={y1,y2,…yn},找出X和Y的最长公共子序列。 分析: 1 最长公共子序列概念 实现明确一个点就是,子序列是一个序列中去掉若干元素后得到的序列,也就是说子序列的元素下标是递增的就行,不需要在原序列中连续。 最长公共子序列,显而易见就是序列X和Y都有的最长的子序列。 2 BruteForce 暴力求解法 对于序列X的所有长度不超过Y的子序列,都...

天天开心 2730

Tiktok/抖音旋转验证码

主要记录一下旋转验证码的逆向思路

记录一些web逆向的过程 5978

RT-DETR算法优化改进:轻量级上采样CARAFE算子 | 注意力机制大作战

上采样操作CARAFE,具有感受野大、内容感知、轻量级、计算速度快等优点,引入RT-DETR二次创新;1)代替Upsample进行使用;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1267

『经典DP入门』LCS 最长公共子序列问题

最长公共子序列问题(Longest Common Subsequence problem):给定两个序列X = <x1,x2,...,xm>和Y = <y1,y2,...,yn>,求X和Y长度最长的公共子序列。 注:本文的大多数概念及求解方法来自《算法导论》 使用动态规划求解LCS问题过程: 一、刻画最长公共子序列的特征 LCS的最优子结构定理:设X={x1,x2,...

Miserable_ccf的博客 7309

4位无符号比较器设计

4位无符号比较器设计

好好学习,天天向上 7891

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

问题描述:给定两个序列X=< x1,x2,x3,…,xm >和Y=< y1,y2,y3,…,yn >,求X和Y长度最长的公共子序列

努力努力再努力x 717

六、大模型(LLMs)参数高效微调(PEFT) 面

链接: https://pan.baidu.com/s/1TYqdCK53tDFEYGtAvpnTbA 提取码: 6a9s。考核中的核心考点,并针对这些考点提供了详尽的解答。通过网盘分享的文件:06大模型(LLMs)参数高效微调(PEFT) 面。)有哪些方法,能不能稍微介绍一下它们间?这种微调方法和全参数比起来有什么劣势吗?能不能总结一下各种参数高效微调方法?高效参数微调,如何进行存储?多种不同的高效微调方法对比。模型显存占用的部分有哪些?微调方法为啥能加速训练?微调计算可训练参数的比例。

weixin_51988935的博客 537

迅投miniQMT量化交易实战指南:从入门到自动化交易系统构建

迅投miniQMT量化交易实战指南摘要 本文全面介绍迅投miniQMT量化交易系统的开发流程,重点包括: 环境配置:详细说明miniQMT极简模式的安装步骤,包括xtquant库获取、Python版本要求及验证方法 行情数据模块:解析xtdata模块的核心功能,包括: 获取板块分类与股票列表 查询合约基础信息 下载历史K线数据(支持tick、分钟、日线等周期) 交易执行模块:介绍xttrader模块的交易API,涵盖: 账户连接与初始化 订单管理(下单、撤单、查询) 持仓与资产查询 实战开发:提供可直接运行

huanghm88的专栏 672
上一篇: dp中的简化背包问题
下一篇: pytorch 单机多GPU训练RNN遇到的问题
srplus
博客等级 码龄10年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值