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

《算法笔记》11.4小节——动态规划专题->最长公共子序列(LCS) 问题 A: 最长公共子序列

题目描述

给你一个序列X和另一个序列Z,当Z中的所有元素都在X中存在,并且在X中的下标顺序是严格递增的,那么就把Z叫做X的子序列。
例如:Z=<a,b,f,c>是序列X=<a,b,c,f,b,c>的一个子序列,Z中的元素在X中的下标序列为<1,2,4,6>。
现给你两个序列X和Y,请问它们的最长公共子序列的长度是多少?

输入

输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。

输出

对于每组输入,输出两个字符串的最长公共子序列的长度。

样例输入 复制
abcfbc abfcab
programming contest 
abcd mnp
样例输出 复制
4
2
0

分析:不妨设现在是第一个串 s1 的第 i 位,与第二个串 s2 的第 j 位在进行比较。

当 s1[i] == s2[j] 时,可以继续比较 i+1 和 j+1位,最长公共子序列长度 +1。

当 s1[i] != s2[j] 时,问题转化为比较 s1[i-1] 和 s2[j], 以及 s1[i] 和 s2[j-1],答案取这两个中的较大值。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include   <string>
#include   <vector>
#include   <cstdio>
#include    <queue>
#include    <stack>
#include    <ctime>
#include    <cmath>
#include      <map>
#include      <set>
#define INF 0x3fffffff
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,r) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<endl
#define db5(x,y,z,r,w) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<", "<<#w<<"="<<(w)<<endl
using namespace std;int main(void)
{#ifdef testfreopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);clock_t start=clock();#endif //testchar s1[110],s2[110];while(~scanf("%s%s",s1+1,s2+1)){int l1,l2;l1=l2=0;int dp[110][110];for(int i=1;s1[i];++i,++l1)dp[i][0]=0;for(int j=1;s2[j];++j,++l2)dp[0][j]=0;dp[0][0]=0;for(int i=1;s1[i];++i){for(int j=1;s2[j];++j){if(s1[i]==s2[j])dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}printf("%d\n",dp[l1][l2]);}#ifdef testclockid_t end=clock();double endtime=(double)(end-start)/CLOCKS_PER_SEC;printf("\n\n\n\n\n");cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位#endif //testreturn 0;
}

http://www.xdnf.cn/news/7589.html

相关文章:

  • 动态规划-LCR 090.打家劫舍II-力扣(LeetCode)
  • 文档债务拖累交付速度?5大优化策略文档自动化
  • 电子电器架构 --- 汽车高性能计算
  • 【踩坑】WUDFHost占用内存高的可能原因
  • 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求
  • 深入解析 OpenManus:开源 AI 智能体框架的技术原理与实践
  • 分钟级降水预报API:精准预测每一滴雨的智慧科技
  • 【物联网】基于树莓派的物联网开发【5】——国内软件镜像源更改配置
  • 使用布隆过滤器实现java大数据筛选是否存在
  • 如何解决虚拟机中U盘无法识别的问题
  • 抖音视频如何下载保存?高清无水印一键保存到手机!
  • 基于Gitee 的开发分支版本管理规范
  • 视频监控联网系统GB28181协议中互联结构详解
  • AI大模型应用微调服务商分享:微调技术Lora和SFT的异同
  • 8 定时任务与周期性调度
  • 小红书“开门”,摸到电商金钥匙?
  • Linux(3)——基础开发工具
  • langchain 实现 任务分解器
  • 深度学习中的正则化方法与卷积神经网络基础
  • leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
  • beanstalk一直被重新保留(reserved 状态)消息删除
  • BACnet协议详解:架构、应用、挑战与未来发展
  • WIFI信号状态信息 CSI 深度学习之数据集
  • 基于自然语言转SQL的BI准确率如何?
  • C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表
  • FastDatasets新功能,让模型学会“思考”!
  • 双指针法高效解决「移除元素」问题
  • python学习打卡day31
  • vue+springboot+element-ui实现table的树懒加载
  • 【windows】音视频处理工具-FFmpeg(合并/分离)