最长递增子序列.
#include <stdio.h>
#define MAX 30005
#define INF 0xffffff
int d[MAX];
int a[MAX];
int binSearch(int* arr, int left, int right, int key) {
int mid;
while (left < right) {
mid = (left + right)>>1;
if (arr[mid] <= key) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
int lis(int* arr, int n) {
int k, i;
for (i = 0; i < n; i++) {
d[i] = INF;
}
for (i = 0; i < n; i++) {
k = binSearch(d, 0, n, arr[i]);
d[k] = arr[i];
}
for (i = 0; i < n; i++) {
if (d[i] == INF) {
return i;
}
}
return i;
}
int main() {
int n;
int i;
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
printf("%d\n", lis(a, n));
}
return 0;
}