编程语言:Java
题目链接:http://poj.org/problem?id=1631
题解:见注释
结果:AC
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static Scanner sc = new Scanner(new BufferedInputStream(System.in));
static int[] dp=new int[40005];
public static void main(String[] args) throws IOException {
in.nextToken();
int n= (int) in.nval;
while(n-->0){
in.nextToken();
int m= (int) in.nval;
int len=0,x;
for(int i=1;i<=m;i++){
in.nextToken();
x= (int) in.nval;
if(x>dp[len]){
//只有当大于最后一个值才会更新
dp[++len]=x;
}else{
//此处的更新,虽然会破坏之前的上升子序列,但是只要最后一个值依然不会改变最长上升子序列的长度
// 当最后一个值被改变的时候,说明已经能够找到一个新的以该数为结尾的相同长度的上升子序列
int l=1,r=len;
while(l<=r){
int mid=(l+r)/2;
if(dp[mid]>x){
r=mid-1;
}else{
l=mid+1;
}
}
dp[l]=x;
}
}
out.println(len);
}
out.flush();
}
}