1 /*再做做这道题是因为另一道题目是反利用这个c数组的,这里复习一下*/
2 #include<iostream>
3 using namespace std;
4 #include<cstdio>
5 #include<cstring>
6 int n;
7 #define N 1010
8 int c[N],f[N],ans=-N,a[N];
9 int search(int l,int r,int k)
10 {
11 if(l==r) return l;
12 int mid=(l+r+1)>>1;/*还有这里的+1*/
13 if(c[mid]>=k) return search(l,mid-1,k);/*这里的mid-1是保证是上升序列*/
14 else return search(mid,r,k);
15 }
16 int main()
17 {
18 scanf("%d",&n);
19 for(int i=1;i<=n;++i)
20 scanf("%d",&a[i]);
21 memset(f,0,sizeof(f));
22 memset(c,127,sizeof(c));
23 for(int i=1;i<=n;++i)
24 {
25 f[i]=search(0,i,a[i])+1;/*这里的具体二分过程最好自己手动模拟一下,以防出错*/
26 c[f[i]]=min(a[i],c[f[i]]);
27 ans=max(f[i],ans);
28 }
29 printf("%d
",ans);
30 return 0;
31 }