这道题最关键的是把EVA喜欢的颜色进行映射,然后再把给出序列的不喜欢的颜色去掉,然后就是LIS问题了。
#include <iostream>
#include <string>
#include <set>
#include <map>
#include<queue>
#include<stack>
#include<algorithm>
//new and delete
//A1045 Favorite Color Stripe
using namespace std;
const int MaxN = 10001;
const int MaxC = 210;
const int Inf = 0x3fffffff;
int color_ha[MaxC]; //颜色hash,Eva喜欢的依次编号0,1...
//找最长不降子列长度
int FindLIS(vector<int> q) {
if (q.size() == 0)
return -1;
int dq[MaxN];
dq[0] = 1;
for (int i = 1; i < q.size(); i++) {
dq[i] = 1;
for (int j = 0; j < i; j++) {
if (dq[j] + 1 > dq[i] && q[j]<=q[i])
dq[i] = dq[j] + 1;
}
}
//找最大值
int MAX = -1;
for (int i = 0; i < q.size(); i++)
if (dq[i] > MAX)
MAX = dq[i];
return MAX;
}
int main() {
int N;
cin >> N;
fill(color_ha, color_ha + MaxC, -1);
int M,index=0;
cin >> M;
//颜色映射->0,1,2...
for (int i = 0; i < M; i++) {
int a;
cin >> a;
color_ha[a] = index;
index++;
}
int L;
cin >> L;
vector<int> seq; //除去不喜欢颜色的编号序列
for (int i = 0; i < L; i++) {
int a;
cin >> a;
if (color_ha[a] != -1)
seq.push_back(color_ha[a]);
}
cout << FindLIS(seq) << endl;
return 0;
}