题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805437411475456

思路

这题的主要思路是这样的

  1. 先把不是喜欢的颜色给踢光
  2. 为了满足题目的顺序要求,需要建立一张顺序映射哈希表
  3. 根据顺序映射哈希表初始化一个顺序序列
  4. 使用这个顺序序列套最长不下降子序列的模版(两个循环、两个条件、一个最大)

代码

  1. #include<vector>
  2. #include<algorithm>
  3. #include<cstdio>
  4. using namespace std;
  5. int main(){
  6. int n, m, l;
  7. vector<int> m_list(10010), l_list(10010), hash_table(210, -1), A(10010), dp(10010);
  8. scanf("%d", &n);
  9. scanf("%d", &m);
  10. for(int i = 0; i < m; i++){
  11. scanf("%d", &m_list[i]);
  12. hash_table[m_list[i]] = i;//输入的进行顺序映射
  13. }
  14. int num = 0;
  15. scanf("%d", &l);
  16. for(int i = 0; i < l; i++){
  17. scanf("%d", &l_list[i]);
  18. if(hash_table[l_list[i]] >= 0)
  19. A[num++] = hash_table[l_list[i]];//把输入的顺序映射过来
  20. }
  21. //下面是最长不下降子序列的模板
  22. int ans = 0;
  23. for(int i = 0; i < num; i++){
  24. dp[i] = 1;
  25. for(int j = 0; j < i; j++){
  26. if(A[j] <= A[i] && dp[j] + 1 > dp[i]) dp[i] = dp[j] + 1;
  27. }
  28. ans = max(ans, dp[i]);
  29. }
  30. printf("%d", ans);
  31. return 0;
  32. }