intmain() { int n; scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &val[i]); for (int i = 1; i <= n; ++i) { f[i] = 1; for (int j = 1; j < i; ++j) if (val[i] > val[j]) 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; }
constint N = 1e5 + 10; int vals[N], q[N];//q用于存储每种长度的子序列的最后一个值的大小
intmain() { int n, len = 0; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d", &vals[i]); q[0] = -2e9;//根据数据范围选定,同时除了空序列,任何序列的长度都大于0 for(int i = 1; i <= n; ++i) { int l = 0, r = len; while(l < r) { int mid = l + r + 1 >> 1; if(q[mid] < vals[i]) l = mid; else r = mid - 1; } len = max(len, r + 1); q[r + 1] = vals[i]; } printf("%d", len); return0; }