LCS
二分法
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 101000;
int a[maxn],n,f[maxn];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9')
{ if(ch=='-')
f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9')
{
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
int main()
{
n=read();
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++)
a[read()]=i;
for(int i=1;i<=n;i++)
{
int x=a[read()];
*lower_bound(f+1,f+n+1,x)=x;
}
printf("%d",lower_bound(f+1,f+n+1,f[0])-f-1);
return 0;
}
一般
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100005;
int n,a[maxn],b[maxn],f[maxn][maxn];
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++)
if(a[i]==b[j])f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
cout<<f[n][n];
return 0;
}