最长公共子序列问题
程序员文章站
2024-03-20 10:07:34
...
最长公共子序列问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
给定两个序列 X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
Input
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
Output
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
Sample Input
ABCBDAB BDCABASample Output
4Hint
Source
代码如下:
#include<stdio.h>
#include<string.h>
char x[550] , y[550] ; //用于序列x和y
int f[550][550] ;
//用来存储x的子序列,y的子序列f[i][j],即 在x中长度为i和y中长度为j的公共子序列
int max(int a , int b )
{
if(a>b)
return a ;
else
return b ;
}
int main()
{
int i, j ;
int len1 , len2 ; //用于记录x和y的字符串长度
//输入数据
while(~scanf("%s %s",x,y))
{
len1 = strlen(x) ;
len2 = strlen(y) ;
memset(f,0,sizeof(f)) ; //初始化,由题意可以分析得只要i和j有一个为0那么f[i][j]为0
//动态过程
for(i=0 ; i<len1 ; i++)
{
for(j=0; j<len2 ;j++)
{
//如果两个子序列终值相等,那么这个终值一定在公共子序列中,所以它公共子序列就是前面公共子序列+1
if(x[i]==y[j])
{
f[i+1][j+1] = f[i][j] +1 ;
}
//如果不相等,那么它的公共子序列不可能含有二个终值,那么它一定是下面两种情况中的最大的。
else
{
f[i+1][j+1] = max(f[i][j+1] , f[i+1][j] ) ;
}
}
}
printf("%d\n",f[len1][len2]) ;
}
return 0 ;
}
上一篇: 二分查找排序算法
下一篇: 二分查找算法及时间复杂度