用二分求最长上升子序列
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int num[1005], ans[1005];
int main(){
int n;
while(scanf("%d", &n) == 1){
for(int i = 0; i < n; i++)
scanf("%d", num+i);
int len = 1;
ans[0] = num[0];
for(int j = 1; j < n; j++){
if(num[j] > ans[len-1])
ans[len++] = num[j];
else{
int d = lower_bound(ans, ans+len, num[j]) - ans;
ans[d] = num[j];
}
}
cout << len << endl;
}
return 0;
}