最长公共子序列

注:子序列是可以不连续的。

递推公式:

\(dp[i+1][j+1]=\begin{cases}dp[i][j]+1&(s_{i+1}=t_{j+1})\\max(dp[i][j+1],dp[i+1][j])&(其 他)\end{cases}\)

代码:

// Created by CAD on 2020/1/14.
#include <bits/stdc++.h>
using namespace std;

const int maxn=1e3+5;
int dp[maxn][maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s,t;
    cin>>s>>t;
    int slen=s.length(),tlen=t.length();
    for(int i=0;i<slen;++i)
        for(int j=0;j<tlen;++j)
            if(s[i]==t[j]) dp[i+1][j+1]=dp[i][j]+1;
            else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
    cout<<dp[slen][tlen]<<endl;
    return 0;
}