构造最长递增子序列
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
在“最长递增子序列”的基础上对代码进行改进,输出一条最长递增子序列。
输入
每组输入包括两行,第一行为序列长度n,第二行为序列。
输出
输出最长递增子序列中的任意一条即可。
样例输入
7
1 7 3 4 9 2 3
样例输出
1 3 4 9
import java.util.Scanner;
public class LIS_On2 {
static int[] a=new int[1010];//存原数据
static int[] b=new int[1010];//b[i]为以a[i]为单调递增子序列最后一个元素时所得的最长单调子序列的和
static int[] pre=new int[1010];//存前一个的位置
static int[] str=new int[1010];
static int n;
static int maxLen;
static int mark;
static void solve(){
b[1]=1;
for(int i=2;i<=n;i++){
maxLen=0;
for(int j=i-1;j>=1;j--){
if(a[j]<a[i]&&b[j]>maxLen){
maxLen=b[j];
pre[i]=j;
}
}
b[i]=maxLen+1;
}
maxLen=b[1];
mark=1;
for(int i=2;i<=n;i++){
if(b[i]>maxLen){
maxLen=b[i];
mark=i;
}
}
int j=mark;
int i=maxLen;
while(pre[j]>0){
str[i--]=a[j];
j=pre[j];
}
str[i]=a[j];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
boolean flag=false;
n=sc.nextInt();
for(int i=1;i<=n;i++){
a[i]=sc.nextInt();
}
solve();
for(int i=1;i<=maxLen;i++){
if(!flag){
System.out.print(str[i]);
flag=true;
}else{
System.out.print(" "+str[i]);
}
}
System.out.println();
// System.out.println(maxLen);
}
}
}
nlogn的做法一下还没理解,懂了再补充吧