intmain() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) { f[i] = 1; // 初始化,最小也有它一个数,所以初始化成1 for (int j = 1; j < i; j++) if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1); } int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, f[i]);
intmain() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
int len = 0; // 用来记录找的过程中子序列的最大值 //int q[0] = -2e9; for (int i = 1; i <= n; i++) { // 二分寻找q数组中小于a[i]的最大值 // 二分的套路:确定边界, 求mid, 设计check函数 int l = 0, r = len; while (l < r) { int mid = l + r + 1 >> 1; if (q[mid] < a[i]) l = mid; else r = mid - 1; } len = max(len, r + 1); // 更新长度 q[r + 1] = a[i]; // 把a[i]放进去 }