最长公共子序列问题(动态规划) SDUT

版权声明:本人原创文章若需转载请标明出处和作者!沙 https://blog.csdn.net/weixin_44143702/article/details/89429776

最长公共子序列问题

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44143702/article/details/89429776