hdu1257
d[i]就是保存到i的最大上升子序列长度
g[i]保存长度为i的最大上升子序列的的最小编号(因为编号越小越有机会有上升子序列的机会)

import java.util.Scanner;

public class Main{
   
    static int n;
    static final int N=10050;
    static final int INF=0x3f3f3f3f;
    static int[] a=new int[N];
    static int[] g=new int[N];
    static int[] d=new int[N];
    public static void main(String[] args) throws Exception {
   
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
   
            n=cin.nextInt();
            for(int i=0;i<n;i++){
   
                a[i]=cin.nextInt();
            }
            /** * O(n^2) */
// for(int i=1;i<n;i++){
   
// for(int j=0;j<i;j++){
   
// if(a[j]<a[i]) {
   
// d[i] = Math.max(d[j], 0) + 1;
// }
// }
// }
            /** * O(nlogn) */
            for(int i=1;i<=n;i++){
   
                g[i]=INF;
            }
            int ans=0;
            for(int i=0;i<n;i++){
   
                int k=lowerBound(g,1,n,a[i]);
                g[k]=a[i];
                d[i]=k;
                ans=Math.max(ans,k);
            }
            System.out.println(ans);
        }
    }

    static int lowerBound(int[] nums,int l,int r,int v){
   
        while(l<r){
   
            int m=l+((r-l)>>1);
            if(nums[m]>=v){
   
                r=m;
            }
            else{
   
                l=m+1;
            }
        }
        return l;
    }
}