题目链接
朴素版本就是O(n*m)
二维dp
dp[i][j]=max(dp[i][j],dp[i−1][j−1]+1);
如果不相同,即无法更新公共元素,考虑继承:
dp[ i ] [ j ] = max(dp[ i-1 ][ j ] , dp[ i ][ j-1 ]dp[i][j]=max(dp[i−1][j],dp[i][j−1]
本题是排列,那么可以由n的一个排列求LIS扩展为该排列与1–n的LCS
const int N=1e5+700;
ll a[N];
ll b[N];
ll d[N];
ll cnt=0;
ll pos[N];
signed main()
{
ll n;
read(n);
for(int i=1; i<=n; i++)
{
read(a[i]);
pos[a[i]]=i;
}
for(int i=1; i<=n; i++)
{
read(b[i]);
if(cnt==0)
{
d[++cnt]=pos[b[i]];
}
else
{
if(pos[b[i]]>=d[cnt])
{
d[++cnt]=pos[b[i]];
}
else
{
d[lower_bound(d+1,d+1+cnt,pos[b[i]])-d]=pos[b[i]];
}
}
}
printf("%lld",cnt);
}