package info.frady.real;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class LIS1025 {
static int[] path=new int[20];
static int[] a=new int[]{3,8,5,4,7,2,9,2,-4,-3,-2,-1};
public static void main(String[] args) {
LinkedList<Integer> list=lis(a);
int len=list.size();
for (int i = a.length-1; i >=0 ; i--) {
if(path[i]==len){//找到最后的节点了
List<Integer> la=new ArrayList<>();
la.add(a[i]);
dfs(path[i],a[i],i,la);
//System.out.println("");
}
}
}
public static void dfs(int index,int num,int end,List<Integer> la){// index是当前数字在lis的位置,num是当前数字,end是最终的
List<Integer> lb=clone(la);
//System.out.print(" "+num+" ");
if(index==1){
System.out.println(Arrays.toString(lb.toArray()));
return;
}
for (int i = end; i >=0 ; i--) {// i是数字在a中的序号
List<Integer> lc=clone(lb);
if(path[i]==index-1 && a[i]<num){// path[i] 存放的是每个数字在list中的位置 index-1是上一个位置
lc.add(a[i]);
dfs(index-1,a[i],i-1,lc);
}
}
}
public static List<Integer> clone(List<Integer> la){
List<Integer> lb=new ArrayList<>();
for (int i = 0; i <la.size() ; i++) {
lb.add(la.get(i));
}
return lb;
}
public static LinkedList<Integer> lis(int [] arr){
LinkedList<Integer> list=new LinkedList<>();
if(arr.length==0){
return list;
}
list.add(arr[0]);
path[0]=1;
for (int i = 1; i <arr.length ; i++) {
int last=list.getLast();
if(arr[i]>last){
list.add(arr[i]);
path[i]=list.size();
}else{
int index= Arrays.binarySearch(list.toArray(),arr[i]);
if(index<0){
index=-index-1;
}
list.set(index,arr[i]);
path[i]=index+1;
}
}
return list;
}
}