最长公共子序列
分析
状态表示
集合f(i,j):所有a[1 , i]和b[1 , j]的公共子序列的集合
属性:求最大值
状态计算
f(i,j)是以下4种情况的最大值
公共子序列不包含a[i]和b[j]的集合 f(i-1,j-1)
公共子序列不包含a[i],包含b[j]的集合 f(i-1,j)-f(i-1,j-1)
公共子序列不包含b[j],包含a[i]的集合 f(i,j-1)- f(i-1,j-1)
公共子序列包含a[i]和b[j]的集合 f(i-1,j-1)+1(要满足a[i]==b[j])
可见第一种情况包含在第二,第三种情况里面
状态转移方程
f[i][j]=max(f[i-1][j],f[i][j-1]); if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int n,m;
char a[N],b[N];
int f[N][N];
int main(){
cin>>n>>m>>a+1>>b+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(a[i]==b[j])f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
cout<<f[n][m]<<endl;
return 0;
}