最长递增子序列问题

最长递增子序列问题

  • 直接代码:

/*
 * 最长递增子序列问题:
 * 在一个堆数中{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]+" ");
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值