题目:
分析:
对于输入的n种颜色,将输入的颜色从1开始依次编号,在输入长度为L的序列时,将其转换为对应的颜色下标编号,那么问题就会转换为最长上升子序列的问题
对于长度为L的序列,求最长上升子序列,容易得知,在长度相同的最长子序列的情况下,最后一个的数越小,这个序列在最后可能形成的序列就越长,依据这个性质我们就可以求出最长的子序列
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 1e4+5;
int num[MAXN],cnt[MAXN];
int val[205];
int n,m,k,ind;
int main()
{
int tmp;
scanf("%d",&n);
scanf("%d",&m);
for(int i=1;i<=m;++i)
{
scanf("%d",&tmp);
val[tmp] = i;
}
scanf("%d",&k);
for(int i=0;i<k;++i)
{
scanf("%d",&tmp);
if(val[tmp])
num[ind++] = val[tmp];
}
int ans = 0;
memset(cnt,INF,sizeof(cnt));
for(int i=0;i<ind;++i)
{
int indx = upper_bound(cnt,cnt+ind,num[i]) - cnt;
ans = max(ans,indx+1);
cnt[indx] = num[i];
}
printf("%d\n",ans);
return 0;
}