思路:
可以先按照给出的数字的先后顺序给出数字的优先级,然后将出现过的数字重新组成一个数组,
然后进行dp,dp的思路是每次保证0~i-1范围内的子串是最长不下降子序列的最长长度,然后更新
第i个节点,不断向后更新。
(题目隐含前提:m个数字,每个数字都不相同)
注意:每一位长度初始都为1。
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
const int maxn = 100100;
vector <int> vc;
map <int,int> mp;
int dp[maxn]={0};
int MAX(int x,int y)
{
return x>y?x:y;
}
int main(void)
{
int n,j,i,k,m,x;
cin>>n>>m;
for(i=1;i<=m;i++){
cin>>x;mp[x]=i;
}
cin>>k;
for(i=1;i<=k;i++){
cin>>x;
if(!mp.count(x)) continue;
else vc.push_back(mp[x]);
}
m=vc.size();
if(m==0){
printf("0\n");
return 0;
}
int len=1;
for(i=0;i<m;i++){
dp[i]=1;
for(j=0;j<i;j++)
if(vc[j]<=vc[i]) dp[i]=MAX(dp[j]+1,dp[i]);
len=MAX(len,dp[i]);
}
printf("%d\n",len);
return 0;
}