intmain() { scanf("%d", &n); for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]); for (int i = 1; i <= n; i ++ ) { f[i] = 1; // 相当于进行一个初始化, 对f[i]初始化为1,只有a[i]一个数值 for (int j = 1; j < i; j ++ ) if (a[j] < a[i]) f[i] = max(f[i], f[j] + 1); } int res = 0; for (int i = 1; i <= n; i ++ ) res = max(res, f[i]); printf("%d", res); return0; }
intmain() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
int len = 0; for (int i = 0; i < n; i ++ ) { int l = 0, r = len; while (l < r) { // 对q 数组进行二分查找,查找结束后r 满足 q[r] < a[i],于是 a[i] 可以放在 r+1 位置上。 int mid = l + r + 1 >> 1; if (q[mid] < a[i]) l = mid; else r = mid - 1; } // 如果 r+1 > len,说明发现了更长的上升子序列。 len = max(len, r + 1); // 把 a[i] 放到 q[r + 1],更新该长度为 r+1 的最小结尾值; q[r + 1] = a[i]; }