首页 > 其他分享 >5752: 最长公共子序列 动态规划

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

时间:2023-04-12 19:23:22浏览次数:34  
标签:int 最大值 5752 字符串 公共 序列 最长 dp

描述

 

一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1,x2,…,xm>,则另一序列Z=<z1,z2,…,zk>是X的子序列是指存在一个严格递增的下标序列<i1,i2,…,ik>,使得对于所有j=1,2,…,k有:

  Xij=Zj

例如,序列Z=<B,C,D,B>是序列X=<A,B,C,B,D,A,B>的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列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的一个公共子序列。而且,后者是X和Y的一个最长公共子序列.因为X和Y没有长度大于4的公共子序列。

给定两个序列X=<x1,x2,…,xm>和Y=<y1,y2….yn>.要求找出X和Y的一个最长公共子序列。

 

 

输入

 

共有两行。每行为一个由大写字母构成的长度不超过1000的字符串,表示序列X和Y。

 

输出

 

第一行为一个非负整数。表示所求得的最长公共子序列的长度。若不存在公共子序列.则输出仅有一行输出一个整数0。

 

样例输入

 

样例输出

 

提示

最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。字符串长度小于等于1000。

dp[i-1][j]是ai不在公共子序列时的最大值
dp[i][j-1]是bj不在公共子序列时的最大值
dp[i][j]是前i个字符串和前j个字符串的公共子序列最大值

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string a,b;
 4 int dp[1001][1001];
 5 //dp[i-1][j]是ai不在公共子序列时的最大值
 6 //dp[i][j-1]是bj不在公共子序列时的最大值
 7 //dp[i][j]是前i个字符串和前j个字符串的公共子序列最大值 
 8 int main()
 9 {
10     cin>>a>>b;
11     int lena = a.length();
12     int lenb = b.length();
13     a = '#'+a;
14     b = '#'+b;
15     for(int i=1;i<=lena;i++)
16         for(int j=1;j<=lenb;j++)
17         {
18             if(a[i]==b[j])dp[i][j] = dp[i-1][j-1]+1; //两两相同,公共子序列长度+1 
19             else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
20         }
21     cout<<dp[lena][lenb];
22      return 0;
23 }

 

 

标签:int,最大值,5752,字符串,公共,序列,最长,dp
From: https://www.cnblogs.com/jyssh/p/17310936.html

相关文章

  • (四)多进程的序列化
    给出cloudpickle的GitHub地址:https://github.com/cloudpipe/cloudpickle     =======================================================   单机的Python序列化模块有自带的pickle,但是在Python的分布式计算中进行序列化则是使用cloudpickle。之所以在分布式计......
  • (三)python多进程multiprocessing模块的变量传递问题:父进程中的numpy.array对象隐式序列
    参考:https://docs.python.org/zh-cn/3/library/multiprocessing.htmlcloudpickle——Python分布式序列化的专用模块python多进程multiprocessing模块的变量传递问题:父进程中的numpy.array对象隐式序列化到子进程后的inplace操作的问题-Death_Knight-博客园(cnblogs.com)......
  • 哈希表:剑指 Offer 48. 最长不含重复字符的子字符串
    题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。   提示:s.length<=40000 思路:双指针(滑动窗口)+哈希表:   复杂度分析:时间复杂度O(N):其中N为字符串长度,动态规划需遍历计算dp列表。空间复杂度O(1......
  • 在C#中使用Attributes(特性)来控制枚举成员是否应该被序列化或映射
    如果标记了[NonSerialized]特性,会防止将该字段序列化。但是,该字段仍然可以用于foreach迭代,因为它仍然是枚举的有效成员。如果要防止特定枚举成员被foreach迭代,用[NonSerialized]特性是不起作用的。相反,可以创建一个自定义的Attribute继承自System.Attribute,并将其应用到需要隐藏的......
  • YBTOJ 5.4例3 最长距离 题解
    挂大分!!!!!!1.一定要看清提干有没有多测2.多测不清空爆零两行泪3.同时线性更新最大值和次大值时记得最大值更新要同时把旧的最大值给次大值题解首先可以想到一个最暴力的暴力:对于每一个点暴力枚举所有的点跑LCA复杂度\(O(n^2logn)\)显然会炸然后就有一个优化一点的暴力:......
  • UVa 10049 Self-describing Sequence (自描述序列&二分递推)
    10049-Self-describingSequenceTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=34&page=show_problem&problem=990SolomonGolomb's self­describingsequence  istheonlynon­decreas......
  • java反序列化(三) JDBC反序列化
    JDBC反序列化前置知识JDBCJDBC(JavaDatabaseConnectivity)是Java提供对数据库进行连接、操作的标准API。Java自身并不会去实现对数据库的连接、查询、更新等操作而是通过抽象出数据库操作的API接口(JDBC),不同的数据库提供商必须实现JDBC定义的接口从而也就实现了对数据库的......
  • python习题-排列组合序列
    【题目描述】用户输入整数n(1<=n<=26)和整数m(m<=n),然后输入n个不同的字母,请编写程序输出在这n个字母中选择m个字母的所有排列序列和组合序列。【源代码程序】importitertools#输入整数n和mn=int(input("请输入整数n(1<=n<=26):"))m=int(input("请输入整数m(m<=n):"))#输入......
  • 300. 最长递增子序列
    题目链接:300.最长递增子序列方法:动态规划解题思路状态表示:\(dp[]\)集合:表示以\(i\)结尾的所有递增子序列;属性:\(dp[i]\)表示集合中最长子序列的长度。状态计算:集合划分:枚举以\(i\)结尾的所有递增子序列的其前一个元素可能的下标[0,i-1],将其划分为以\(i\)结......
  • C#数据序列化研究:改进版KLV
    所谓KLV即Key-Length-Value,以【键-数据长度-数据】的形式将数据序列化成字节流,这是一种高性能和兼容性的数据序列化方案,,缺点就是用起来很麻烦,其出现的需求场景如下:1,硬件和云端的数据交互,最开始是以流的形式顺序写入数据,但是由于版本迭代,数据字段难免出现新增插入更新移除等现......