方法:动态规划,状态方程len[i]=max(len[i],len[j]+1), 其中j在位置i之前,即j<i。
#include <iostream>
using namespace std;
const int maxn=10010;
int numc,M,L,forder[210],origin[10010]={0},prior[210]={0},maxlen=0,len[maxn]={0};
//prior表示最喜欢的颜色的优先级,len记录以该位置颜色结尾的最大长度
int main(){
scanf("%d%d",&numc,&M);
for(int i=0;i<M;i++){
scanf("%d",&forder[i]);
prior[forder[i]]=numc-i; //
}
scanf("%d",&L);
for(int i=0;i<L;i++)
scanf("%d",&origin[i]);
for(int i=0;i<L;i++){
if(prior[origin[i]]==0) continue; //不是最喜欢的颜色直接跳过
len[i]=1;
for(int j=0;j<i;j++){
if(prior[origin[j]]==0) continue; //不是最喜欢的颜色直接跳过
if(prior[origin[j]]>=prior[origin[i]]) len[i]=max(len[i],len[j]+1);
}
if(len[i]>maxlen) maxlen=len[i];
}
printf("%d",maxlen);
return 0;
}