最长公共子序列
这个算法时间复杂度为O(n方)
/*
最长公共子序列
给定两个序列,求出最长的公共子序列
思路:
使用dp[i][j]作为第一个串的前i位,第二个串的前j位的最长公共子序列的长度
那么有状态转移方程
一、如果A[i]和B[j]相同
dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j])
二、如果不相同
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
*/
#include<iostream>
using namespace std;
int dp[10002][10002];
int n;
int a[10002],b[10002];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//这是继承
if(a[i]==b[j])
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
//这里用到了max,是因为需要比较是继承之前的还是要现在的
}
}
cout<<dp[n][n];
return 0;
}