7-4 sdut-C语言实验-最长公共子序列

简介: 7-4 sdut-C语言实验-最长公共子序列

7-4 sdut-C语言实验-最长公共子序列问题


分数 20


全屏浏览


切换布局


作者 马新娟


单位 山东理工大学


最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。


最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序,比如Diff工具,和生物信息学应用的基础。它也被广泛地应用在版本控制,比如Git用来调和文件之间的改变。


给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。


###输入格式:

输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。


###输出格式:

每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。


###输入样例:

1. ABCBDAB
2. BDCABA


###输出样例:

4


代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB


#include <stdio.h>
#include <string.h>
#define N 510
int i,j,len1,len2,c[N][N];
char x[N],y[N];
int main()
{while(scanf("%s %s",x,y)!=EOF){
   len1=strlen(x);
   len2=strlen(y);
   for(i=0;i<=len1;i++)
   {c[i][0]=0;}
   for(j=0;j<=len2;j++) {c[0][j]=0;}
   for(i=1;i<=len1;i++){
       for(j=1;j<=len2;j++)
       {
           if(x[i-1]==y[j-1])//这里一定要注意
{
            c[i][j]=c[i-1][j-1]+1;
       } 
           else
           {
               if(c[i-1][j]>c[i][j-1])
               {c[i][j]=c[i-1][j];}
               else{ c[i][j]=c[i][j-1];}//max
           }
           
}}
    printf("%d\n",c[len1][len2]); }
    return 0;
    
}
目录
相关文章
|
2天前
|
BI
7-6 sdut-C语言实验-最长上升子序列的和
7-6 sdut-C语言实验-最长上升子序列的和
12 2
|
2天前
|
BI
7-6 sdut-C语言实验-最长上升子序列
7-6 sdut-C语言实验-最长上升子序列
11 1
|
2天前
7-4 sdut-C语言实验-区间覆盖问题
7-4 sdut-C语言实验-区间覆盖问题
9 2
|
2天前
|
算法
7-2 sdut-C语言实验-数字三角形问题
7-2 sdut-C语言实验-数字三角形问题
6 1
|
2天前
7-2 sdut-C语言实验-删数问题(贪心法二)
7-2 sdut-C语言实验-删数问题(贪心法二)
10 2
|
2天前
7-8 sdut-C语言实验-取数字问题
7-8 sdut-C语言实验-取数字问题
8 2
|
2天前
7-10 sdut-C语言实验-走迷宫
7-10 sdut-C语言实验-走迷宫
8 2
|
2天前
7-5 sdut-C语言实验-最长公共子序列
7-5 sdut-C语言实验-最长公共子序列
7 0
|
2天前
|
BI
7-7 sdut-C语言实验-上升子序列
7-7 sdut-C语言实验-上升子序列
8 0
|
2天前
7-8 sdut-C语言实验-全排列问题
7-8 sdut-C语言实验-全排列问题
6 0