## 最长公共子序列
依旧是dp的入门题目,考虑用f[i][j]表示第一行的i个字母与第二行的j个字母能构成的最长解是多少,然后用当前阶段推下一阶段。
对与dp[i][j],若arr[i]==brr[j]则f[i][j]取f[i-1][j-1]+1即可,若不等的话,则转移到f[i][j-1],或者f[i-1][j]即可,即不匹配后放弃第一行的i或者放弃第二行的j,取max即可。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;
const int N = 1200;
char arr[N],brr[N];
int n,m,f[N][N];
int main()
{
ios::sync_with_stdio(0);
cin>>n>>m>>arr+1>>brr+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(arr[i]==brr[j]){
f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
else f[i][j]=max(f[i][j-1],f[i-1][j]);
}
}
cout<<f[n][m]<<endl;
return 0;
}