设计一个O(n2)复杂度的算法,找出由n个数组成的序列的最长单调递增子序列。
public class LIS {
//测试数据1:3, 8, 10, 4, 12, 5, 6, 8
//测试数据1:5, 2, 4, 6, 5, 1, 8
//测试数据1:3, 8, 9, 10, 11, 4, 12, 5, 6, 8
int [] a = new int[]{5, 2, 4, 6, 5, 1, 8};//存储数据
int [] b = new int[a.length];//存储每个元素的最长单调递增子序列
int [][] ab = new int[a.length][a.length];//存储每个元素的单调递增子序列值
public void lis(){
//查找每个元素的子序列
b[0] = 0;
for(int i = 0;i < a.length;i++){
int k = 0;
for(int j = 0;j < a.length;j++){
if(j <= i && a[j] <= a[i] && a[j] > k){
b[i]++;
k = a[j];
ab[i][j] = a[j];
}else if(j > i && a[j] > a[i] && a[j] > k){
b[i]++;
k = a[j];
ab[i][j] = a[j];
}
}
}
//查找最长子序列
int max = b[0];//记录最大子序列值
int ii = 0;//记录最大子序列值下标
for(int i = 0;i < b.length;i++){
//System.out.println("====="+b[i]);
if(b[i] > max){
max = b[i];
ii = i;
}
}
System.out.println("最长单调递增子序列长度:"+max);
// for(int i = 0;i < a.length;i++){
// for(int j = 0;j < b.length;j++){
// System.out.print(ab[i][j]+" ");
// }
// System.out.println();
// }
System.out.print("最长单调递增子序列为:");
for(int j = 0;j < a.length;j++){
if(ab[ii][j] != 0){
System.out.print(ab[ii][j]+" ");
}
}
}
public static void main(String[] args) {
new LIS().lis();
}
}