为什么写n方的呢
因为我刚学dp。。。
先附代码,困了先睡了(高烧难退啊。。。)
然后这个数据大概只能完成1000的。。。(不会nlogn的蒟蒻)
//Writer:jr HSZ;%%%WJMZBMR
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<ctime>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cctype>
#include<cerrno>
#include<clocale>
#include<complex>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<limits>
#include<list>
#include<map>
#include<ios>
#include<iosfwd>
#include<istream>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<utility>
#include<vector>
#include<cwchar>
#include<cwctype>
#include <algorithm>
#define LL long long
#define f(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
int n,m;
int a[100005],b[100005];
int dp[1005][1005];
int main() {
cin>>n;
m=n;
f(i,1,n) {
scanf("%d",&a[i]);
}
f(i,1,m) {
scanf("%d",&b[i]);
}
f(i,1,n) {
f(j,1,m) {
if(a[i]==b[j]) {
dp[i][j]=dp[i-1][j-1]+1;/*表示长度为a中i的前缀 和b中
长度为j的前缀的lcs,在a[i]+b[j]相等时(即记他俩为lcs的
一部分),dp[i][j]就是前i-1和前j-1再加一*/
} else {
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
cout<<dp[m][n];
return 0;
}