1.用一个数组里面存储喜爱数字的值来区分数字是不是喜爱,以及值的大小顺序,用vector循环删除a数组中不是喜爱的元素,这里it=erase()之后it自动指向下一个元素,由于循环每次还要自增1,所以要加上it--。
2.然后就是写dp来寻找最长的序列,序列可以不是连续的,也就是并不是所有的喜爱数字都要选取。
#include <bits/stdc++.h> using namespace std; int main() { int n; scanf("%d", &n); vector<int>p(n+1, -1); int m; int i; scanf("%d", &m); for (i = 0; i < m; i++) { int k; scanf("%d", &k); p[k] = i; } int l; scanf("%d", &l); vector<int>a(l, -1); for (i = 0; i < l; i++) { scanf("%d", &a[i]); } vector<int>::iterator it = a.begin(); for (; it != a.end(); it++) { if (p[*it]<0) { it=a.erase(it);//erase()删除的用法. it--; } } vector<int>dp(a.size(), 1); int j; int ans = -1; for (i = 0; i < a.size(); i++) { for (j = 0; j < i; j++) { if (p[a[i]]>=p[a[j]] && dp[j]+1>dp[i]) dp[i] = dp[j] + 1; } ans = max(ans, dp[i]); } printf("%d ", ans); }