题目描述
在“最长递增子序列”的基础上对代码进行改进,输出一条最长递增子序列。
输入
每组输入包括两行,第一行为序列长度n,第二行为序列。
输出
输出最长递增子序列中的任意一条即可。
样例输入
7
1 7 3 4 9 2 3
样例输出
1 3 4 9
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n,max,sign;
n = sc.nextInt();
//输入
int a[] = new int[n+1];
//存放以第i个数结尾的最长递增子序列长度
int b[] = new int[n+1];
//存放i前面最大的b数组值的位置
int pre[] = new int[n+1];
//存放构造后的序列
int c[] = new int[n+1];
for(int i=1;i<=n;i++)
a[i] = sc.nextInt();
b[1] = 1;
//计算b数组的值
for(int i=2;i<=n;i++) {
//遍历以第i个数字结尾
int max1 = 0;
for(int j=i-1;j>=1;j--) {
if(a[j]<a[i]&&b[j]>max1) {
max1 = b[j];
pre[i] = j;
}
}
b[i] = max1 + 1;
}
max = b[1];
//sign表示存储最长递增子序列的最后一个值位置
sign = 1;
for(int i=2;i<=n;i++) {
if(b[i]>max) {
max = b[i];
sign = i;
}
}
//表示结尾的位置
int s = sign;
//表示最长递增子序列长度
int num = max;
//表示构造的最后一个数字
int j = max;
while(num>0) {
//加进一个,减少一个
c[j] = a[s];
j--;
//换上一个位置继续传入
s = pre[s];
//总数减少
num--;
}
for(int i=1;i<=max;i++) {
if(i==max)
System.out.print(c[i] + "\n");
else
System.out.print(c[i] + " ");
}
}
}