最长公共子序列

2023-08-27   


题意:

给定字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

分析:

状态表示: F[i][j]F[i][j]表示所有A[1:i]A[1:i]B[1:j]B[1:j]的公共子序列的集合
集合划分:a[i]a[i],b[j]b[j]是否包含在子序列当中为依据

{F[i][j]=max(F[i1][j],F[i][j1])a[i]!=b[j]F[i][j]=max(F[i][j],F[i1][j1]+1)otherwise \begin{cases} F[i][j]=max(F[i-1][j],F[i][j-1]) & a[i]!=b[j] \\ F[i][j]=max(F[i][j], F[i-1][j-1]+1) & otherwise \end{cases}

LCS

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;

int n, m;
char a[N], b[N];
int f[N][N];

int main() {
    cin >> n >> m;
    cin >> (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] = max(f[i - 1][j], f[i][j - 1]);
            } else {
                f[i][j] = max(f[i][j], f[i - 1][j - 1] + 1);
            }
        }
    }
    cout << f[n][m] << endl;
    return 0;
}

Q.E.D.