当前位置: 首页 > 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.lryc.cn/news/617564.html

相关文章:

  • golang 基础案例_01
  • Go选手如何快速上手第三方库
  • Springboot-vue 地图展现
  • JDK21虚拟线程和 Golang1.24协程的比较
  • 《姜妮与Veda的最后一次传输》
  • 李宏毅2025《机器学习》-第十讲:AI“思想钢印”:深入解析大模型的知识编辑技术
  • 秒懂边缘云|1分钟了解边缘安全加速 ESA
  • 机器学习——K-means聚类
  • 第9节 大模型分布式推理核心挑战与解决方案
  • 数据备份与进程管理
  • 机器学习:基于OpenCV和Python的智能图像处理 实战
  • 芯片设计流程
  • C# 异步编程(计时器)
  • 【C++】封装哈希表模拟实现unordered_set和unordered_map
  • Android 16 的用户和用户组定义
  • 基于倾斜摄影三维模型影像提取水面
  • Spring源码解析 - SpringApplication run流程-prepareContext源码分析
  • 了解不同电磁仿真类型中的电容报告
  • 某地渣库边坡自动化监测服务项目
  • GDB调试 core dump 文件与栈溢出分析
  • 农业气象站的应用场景拓展
  • 学习观察和行动:机器人操作中任务-觉察的视图规划
  • 2025年渗透测试面试题总结-13(题目+回答)
  • Python训练营打卡 DAY 33 MLP神经网络的训练
  • 首涂模板第45套主题2.0修正版苹果CMS模板奇艺主题二开源码
  • 【AxureMost落葵网】CRM客户关系管理原型系统-免费
  • MD5:理解MD5 / MD5核心特性 / MD5 在前端开发中的常见用途 / 在线生成MD5 / js-md5
  • 【Kafka系列】第三篇| 在哪些场景下会选择使用 Kafka?
  • 【车联网kafka】Kafka核心架构与实战经验(第三篇)
  • 钓鱼鱼饵制作的方式