题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805437411475456
思路
这题的主要思路是这样的
- 先把不是喜欢的颜色给踢光
- 为了满足题目的顺序要求,需要建立一张顺序映射哈希表
- 根据顺序映射哈希表初始化一个顺序序列
- 使用这个顺序序列套最长不下降子序列的模版(两个循环、两个条件、一个最大)
代码
#include<vector>#include<algorithm>#include<cstdio>using namespace std;int main(){int n, m, l;vector<int> m_list(10010), l_list(10010), hash_table(210, -1), A(10010), dp(10010);scanf("%d", &n);scanf("%d", &m);for(int i = 0; i < m; i++){scanf("%d", &m_list[i]);hash_table[m_list[i]] = i;//输入的进行顺序映射}int num = 0;scanf("%d", &l);for(int i = 0; i < l; i++){scanf("%d", &l_list[i]);if(hash_table[l_list[i]] >= 0)A[num++] = hash_table[l_list[i]];//把输入的顺序映射过来}//下面是最长不下降子序列的模板int ans = 0;for(int i = 0; i < num; i++){dp[i] = 1;for(int j = 0; j < i; j++){if(A[j] <= A[i] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;}ans = max(ans, dp[i]);}printf("%d", ans);return 0;}
