求最长公共子序列长度

求最长公共子序列长度

题干

给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N, M≤10001≤N, M≤1000

输入样例:

4 5
acbd
abedc

输出样例:

3

解法

  1. 采用动态规划法,两层循环遍历。f[N][N]表示当前字符串状态

  2. 伪代码:

    if a[i] = a[j]
        f[i][j] = f[i - 1][j - 1] + 1;
    else
        f[i][j] = max(f[i - 1][j], f[i][j + 1]);
    

  3. 代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N = 1010;
    char a[N], b[N];
    int f[N][N];
    int n, m;
    
    int main(){
        scanf("%d%d", &n, &m);
        scanf("%s%s", a + 1, b + 1);
        
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; 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[n][m]);
            
        return 0;
    }
    
    
posted @ 2022-02-26 16:45  ture?  阅读(63)  评论(0编辑  收藏  举报