最长单调递增子序列问题
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(); } }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- JavaScript数据结构和算法之图和图算法