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

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

题目描述

 一个给定的子序列是在该序列中删去若干元素后得到的序列。例如,序列z=<B,C,D,B> 是序列X=<A,B,C,B,D,A,B>的子序列;
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X,Y的公共子序列。
例如,若X=<A,B,C,B,D,A,B>,Y=<B,D,C,A,B,A>,
那么:<B,C,A>是X和Y的一个公共子序列,<B,C,B,A>也是X和Y的一个公共子序列;
编程求出给定的两个序列中,最长公共子序列的长度。

输入

共两行,各一个字符串,第一个字符串表示第一个序列,第二个字符串表示第二个序列,两个字符串长度均小于1000。

输出

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

样例输入
aabaaecd
abcd
样例输出
4

思路分析

aabaaecd
a11111111
b11222222
c11222233
d11222234

动态规划。

dp[i][j]存储 字符串a的前i个字符 与 字符串b的前j个字符 的公共子序列的最大长度。

当a[i]=b[j]时,更新dp[i][j]=dp[i-1][j-1]+1。

当a[i]≠b[j]时,更新dp[i][j]=max(dp[i-1][j],dp[i][j-1])。

以本题样例为例,求解两字符串最长公共子序列长度,本质就是构建以上二维表格。

代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int m,n;
string a,b;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>a>>b;m=a.size();n=b.size();vector<vector<int>>dp(m+1,vector<int>(n+1,0));for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}}cout<<dp[m][n];return 0;
}

http://www.dtcms.com/a/326481.html

相关文章:

  • Nacos添加权限
  • uart通信中出现乱码,可能的原因是什么 ?
  • Linux软件编程:标准IO(ASCII文件)
  • Discuz论坛和java应用的架构部署
  • 视频剪辑的工作流程
  • 笔试——Day35
  • 用 Flink SQL 和 Paimon 打造实时数仓:深度解析与实践指南
  • GitHub的简单使用方法----(1)
  • 论文阅读 arxiv 2024 MemGPT: Towards LLMs as Operating Systems
  • 平衡二叉树(AVL)解析与实现
  • python每日一题 1的数量 非常简单
  • 松灵机器人 scout ros2 galactic 驱动 安装,并且跑巡线算法
  • 深入剖析 C++ STL 中的 std::list 容器
  • 一篇文章解决Unity没有添加模块选项的问题
  • Linux系统编程 | 线程池
  • Redis7 GEO功能介绍与电商场景案例解析
  • Static CXL Switch:静态CXL交换机相关内容
  • leecode875 爱吃香蕉的珂珂
  • 【Unity】打包学习笔记
  • pip 和 conda,到底用哪个安装?
  • 【已解决】【obsidian插件开发】svg图标路径不正确
  • 第16届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2025年1月12日真题
  • 机器翻译:一文掌握序列到序列(Seq2Seq)模型(包括手写Seq2Seq模型)
  • 豆包 + 蘑兔 AI:音乐创作的梦幻组合
  • UE5太空射击游戏入门(二):场景搭建与自动飞行
  • JS-第二十三天-正则
  • Vue2篇——第二章 Vue从指令修饰符到侦听器的全面解析(重点)
  • 反射之Reflect
  • 网页复杂文本信息解析提取-Crawl4AI+Ollama
  • week1+2+3