直接把问题转化成最长不下降子序的问题。
这个题目时间的要求比较高。所以注意数据的处理。
一是爱娃不喜欢的颜色不放进比较序列里面直接丢掉能加快处理。
二是在转序列的时候注意直接把转好的序列丢进去不然会超时
三是在转序号的时候注意没有匹配的情况。虽然进行第一步后不用考虑这一步。这涉及到样例3的通过还是说下。
map的特殊性 没有赋值的会匹配到0上
2 3 1 5 6
4 2 2 2 2 2 4就会映射成 0 1 1 1 1 1 0 结果为5 而不是4.
这里要注意没有匹配的数会直接匹配成0,而导致出问题,需要注意下。
#include <iostream>
#include <cstring>
#include <climits>
#include <vector>
#include <map>
#include <algorithm>
#define MAX1 205
#define MAX2 10010
using namespace std;
int n;
int fav[MAX1],l[MAX2];
int dp[MAX2];//记录长度
int times;
//转化为最长不下降子序问题
map <int,int> l2no;
//是否是喜欢的颜色
map <int,bool> isLike;
int main(){
scanf("%d",&n);
//输入数据
scanf("%d",×);
for(int i =1;i <= times;i++){
scanf("%d",&fav[i]);
l2no[fav[i]] = i;
isLike[fav[i]] = true;
}
scanf("%d",×);
int n = 1,temp;
for(int i = 1; i<= times;i++){
scanf("%d",&temp);
if(isLike[temp]){//喜欢的才加入
l[n++] = l2no[temp];//直接把转化的序号丢到数组里面减少时间 不然超时
}
}
//判定
int ans = -1;
for(int i = 1; i < n;i++){
dp[i] = 1;
for(int j = 1; j < i; j++){
if(l[i] >= l[j] && dp[j] + 1 > dp[i]){
dp[i] = dp[j] + 1;
}
}
ans = max(dp[i],ans);
}
cout << ans << endl;
return 0;
}