最长递增子序列问题
-
直接代码:
/*
* 最长递增子序列问题:
* 在一个堆数中{5,2,8,6,3,6,9,7},找到这堆数的最长子序列,其最长子序列为2 3 6 9
* 思路:
* 分一个矩形的情况,1个里搜索最长的,
* ...
* 分n个矩形的情况,n个里搜索最长的
* 存储前面的情况,往后推后面的情况:
* 看下一个是否比前一个大,+1的下一个最长值是否比前一个长,但注意每一次的初始化要为1,重新去遍历去搜索
*/
public class Main {
public static void main(String[] args) {
int [] arr=new int[]{5,2,8,6,3,6,9,7};
new Main().solve(arr, arr.length);
}
public void solve(int [] arr,int length){
int[] L=new int[length];//返回此个数矩形的最长长度
int[][] numArr=new int[length][length];//用以存储每个数量矩形的最长的子序列
for(int i=0;i<length;i++){
L[i]=1;//初始化为1,一个的时候,长度也为一个
numArr[i][0]=arr[i];//为存储到最长序列做准备
}
for(int i=1;i<length;i++){
int max=1; //初始化递增子序列的最大值为1,使其再次检索以往的序列,更新得到最大的序列
for(int j=i-1;j>=0;j--){//对原有的序列进行往回找,更新序列
if(arr[j]<arr[i]&&max<L[j]+1){//找下一个是否比他大,并且序列更长
max=L[j]+1;
L[i]=max;
for(int k=0;k<max-1;k++){
numArr[i][k]=numArr[j][k];//更新并存最长递增子序列
}
numArr[i][max-1]=arr[i];//新增的
}
}
}
int index=0;
for(int i=0;i<length;i++){
if(L[index]<L[i])//找出最大的序列
index=i;
}
System.out.println("最大的递增子序列的长度为"+L[index]+"序列为是:");
for(int i=0;i<L[index];i++){
System.out.print(numArr[index][i]+" ");
}
}
}
-
详细参考资料:跟着编程之美学算法——最长递增子序列