最長上升子序列模板(Java版)
阿新 • • 發佈:2018-12-19
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;
}
}