最长公共子序列问题
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
给定两个序列X=
Input
输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。
Output
每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。
Example Input
ABCBDAB BDCABA
Example Output
4
最长公共子序列:在两段字符中,任意去掉其中的字符,剩余的不改变原来顺序,并组成新的字符串。
最长公共子序列是指多个字符串可具有的最大长度的公共子序列。
#include<cstdio>
#include<cstring>
using namespace std;
char x[505],y[505];
int num[505][505];
int flag[505][505];
void LCS()//动态规划求解
{
int i,j;
for(i=1;i<=strlen(x);i++)
{
for(int j=1;j<=strlen(y);j++)
{
if(x[i-1]==y[j-1])
{
num[i][j]=num[i-1][j-1]+1;
flag[i][j]=1;//向下标记
}
else if(num[i][j-1]>num[i-1][j])
{
num[i][j]=num[i][j-1];
flag[i][j]=2;//向右标记
}
else
{
num[i][j]=num[i-1][j];
flag[i][j]=3;//向下标记
}
}
}
}
int main()
{
while(scanf("%s %s",x,y)!=EOF)
{
memset(num,0,sizeof(num));
memset(flag,0,sizeof(flag));
LCS();
printf("%d\n",num[strlen(x)][strlen(y)]);
}
return 0;
}