T3通过代码,不过题目描述似乎有问题,反馈他们说没问题。 #include <iostream> #include <sstream> #include <vector> #include <string> #include <cstring> #include <cmath> #include <algorithm> #include <cstdio> #include <cstdlib> #include <stack> #include <queue> #include <map> using namespace std; #define MAXN 50010 const int INF = 1e9; int idx[MAXN]; int b[MAXN]; int a; int dp[MAXN]; int main() { int n; scanf("%d", &n); for(int i=0; i<n; i++){ scanf("%d", &a); idx[a-1] = i; } for(int i=0; i<n; i++){ scanf("%d", &a); b[i] = idx[a-1]; dp[i] = INF; // 初始化为无限大 } //最长递增子序列 int pos = 0; // 记录dp当前最后一位的下标 dp[0] = b[0]; // dp[0]值显然为a[0] for (int i = 1; i < n; i++) { if (b[i] > dp[pos]) // 若a[i]大于dp数组最大值,则直接添加 dp[++pos] = b[i]; else // 否则找到dp中第一个大于等于a[i]的位置,用a[i]替换之。 dp[lower_bound(dp, dp + pos + 1, b[i]) - dp] = b[i]; // 二分查找 } printf("%d\n", pos+1); return 0; }
点赞 2

相关推荐

03-26 13:44
南华大学 Java
在看面经的花生米很野蛮:这种情况下你当然要回答,你也是吗!!!!我超喜欢他的XXXXX
点赞 评论 收藏
分享
牛客网
牛客企业服务