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\n",ans);
30 return 0;
31 }