您的位置:首页 > 其它

最长单调递增子序列问题

2015-05-31 02:14 162 查看
设计一个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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法