这个题目,是每次添加一个数字后,都要求LIS
目前还没有AC,主要的一个原因是 数据输入的部分,添加的位置不是在最后,输入还没有想好怎么处理
是个省选题目,有点难度
package info.frady.luogu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
public class P4309 {
public static void main(String[] args) throws Exception{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(reader.readLine());
int N=Integer.parseInt(st.nextToken());
st=new StringTokenizer(reader.readLine());
List<Integer> list=new ArrayList<Integer>();
for (int i = 0; i <N ; i++) {
list.add(Integer.parseInt(st.nextToken()));
System.out.println(LIS(list));
}
reader.close();
}
public static int LIS(List<Integer> arr){//如果数字比上一个大,那就追加到栈中, 如果小,那就替换大于等于这个数字的最小的一个数字
LinkedList<Integer> list=new LinkedList<Integer>();
list.add(arr.get(0));
for (int i = 1; i <arr.size() ; i++) {
int last=list.getLast();
//System.out.printf("%d %d \n", top,arr[i]);
if(arr.get(i) > last){
list.add(arr.get(i) );
}else{
int index=searchList(list,arr.get(i));
//System.out.printf(" index:%d 当前是 %d \n",index,list.get(index));
list.set(index,arr.get(i));
}
//printList(list);
}
return list.size();
}
public static int searchList(LinkedList<Integer> arrs, int a){
int low=0;
int high=arrs.size()-1;
while(low<=high){
int mid=(low+high)/2;
if(arrs.get(mid)==a){
return mid;
}else if(arrs.get(mid)>a){//要查找的a在当前的左边,需要修改高位
high=mid-1;
}else{//在右边,需要修改低位
low=mid+1;
}
}
return low;
}
}