蓝桥杯 ADV-202 算法提高 最长公共子序列

算法提高 最长公共子序列

时间限制:1.0s   内存限制:256.0MB

问题描述

  给定两个字符串,寻找这两个字串之间的最长公共子序列。

输入格式

  输入两行,分别包含一个字符串,仅含有小写字母。

输出格式

  最长公共子序列的长度。

样例输入

abcdgh
aedfhb

样例输出

3

样例说明

  最长公共子序列为a,d,h。

数据规模和约定

  字串长度1~1000。 

分析:设两个字符串分别为a[1..n]b[1..m]。设f(i, j)为子串a[1..i]b[1..j]的最长公共子序列的长度,其递推关系式为

f(i, j) = \begin{cases} f(i-1, j-1) + 1 & \text { if } a[i] = b[j] \\ \max \{ f(i-1, j), f(i, j-1) \} & \text{ otherwise } \end{cases}

初始条件:f(i, 0) = f(0, j) = 0

#include <stdio.h>
#include <string.h>

int max(int a, int b)
{
    return a > b ? a : b;
}

int main()
{
    char a[1005] = { 0 }, b[1005] = { 0 };
    int len_a, len_b;
    int f[1005][1005] = { 0 };

    scanf("%s", a + 1);
    scanf("%s", b + 1);
    len_a = (int)strlen(a + 1);
    len_b = (int)strlen(b + 1);

    for (int i = 1; i <= len_a; ++i)
    {
        for (int j = 1; j <= len_b; ++j)
        {
            if (a[i] == b[j])
                f[i][j] = f[i-1][j-1] + 1;
            else
                f[i][j] = max(f[i-1][j], f[i][j-1]);
        }
    }
    printf("%d", f[len_a][len_b]);

    return 0;
}
发布了298 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/liulizhi1996/article/details/104240860