版权声明:本人原创文章若需转载请标明出处和作者!沙 https://blog.csdn.net/weixin_44143702/article/details/89429776
最长公共子序列问题
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 BDCABA
Sample Output
4
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
char x[505], y[505];
int q[505][505];
int main()
{
int i, j, length_x, length_y;
while(~scanf("%s %s", x, y))
{
length_x = strlen(x);
length_y = strlen(y);
for(i = 0; i <= length_x; i++)
{/// q数组的 (1 - length_x) 对应 字符数组的 (0 - length_x - 1)
q[i][0] = 0;
}
for(j = 0; j <= length_y; j++)
{
q[0][j] = 0;
}
for(i = 1; i <= length_x; i++)
{///此处 i 最后应该等于 length_x 此时为x[length_x - 1]对应于q[length_x]
for(j = 1; j <= length_y; j++)
{///此处 j 最后应该等于 length_j 此时为x[length_j - 1]对应于q[length_j]
if(x[i - 1] == y[j - 1])///如果两个字符相等,则等于
q[i][j] = q[i - 1][j - 1] + 1;///其[i - 1][j - 1]的长度 + 1
else if(q[i][j - 1] > q[i - 1][j])///若两字符不相等且左方大于上方
q[i][j] = q[i][j - 1];///则该位置长度等于左方长度
else///上方大于左方
q[i][j] = q[i - 1][j];
}
}
printf("%d\n", q[length_x][length_y]);///输出对应最后一个字符的长度
}
return 0;
}