AcWing 897. 最长公共子序列(LCS朴素版)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 897. 最长公共子序列(LCS朴素版)相关的知识,希望对你有一定的参考价值。

题目连接

https://www.acwing.com/problem/content/899/

思路

我们定义 f [ i ] [ j ] f[i][j] f[i][j]表示的是a串中长度为i和b串长度为j的最长公共子序列长度,那么我们当前匹配到的a[i]b[j]如果相等 f [ i ] [ j ] f[i][j] f[i][j]的值一定是从 f [ i − 1 ] [ j − 1 ] f[i-1][j-1] f[i1][j1]转移过来的,即 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + 1 f[i][j]=f[i-1][j-1]+1 f[i][j]=f[i1][j1]+1,否则的话我们就要从i-1的长度和j-1的长度中选择一个较好的情况即 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i ] [ j − 1 ] ) f[i][j] = max(f[i-1][j],f[i][j-1]) f[i][j]=max(f[i1][j],f[i][j1])

代码

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

const int N = 1e3+10;
int n,m;
int f[N][N];//f[i][j]表示的是a串中长度为i和b串长度为j的最长公共子序列长度
char a[N],b[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] = f[i-1][j-1] + 1;
            else f[i][j] = max(f[i-1][j],f[i][j-1]);
    cout<<f[n][m]<<endl;
    
    return 0;

以上是关于AcWing 897. 最长公共子序列(LCS朴素版)的主要内容,如果未能解决你的问题,请参考以下文章

897. 最长公共子序列

算法基础课题目时间

AcWing 3510- 最长公共子序列 - 贪心+二分优化

AcWing 895. 最长上升子序列(LIS朴素做法)

最长公共子序列(LCS)

[Mdp] lc1035. 不相交的线(LCS+LIS+重点知识理解)