最长上升子序列,输出长度和符合要求的子序列

给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。
说明
最长上升子序列的定义:


最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
https://en.wikipedia.org/wiki/Longest_increasing_subsequence


样例
给出 [5,4,1,2,3],LIS 是 [1,2,3],返回 3 和 1 2 3

给出 [4,2,4,5,3,7],LIS 是 [2,4,5,7],返回 4 和 2 4 5  7

import java.util.Scanner;

/**
 * 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。
说明
最长上升子序列的定义:

最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
https://en.wikipedia.org/wiki/Longest_increasing_subsequence

样例
给出 [5,4,1,2,3],LIS 是 [1,2,3],返回 3
给出 [4,2,4,5,3,7],LIS 是 [2,4,5,7],返回 4
 * 
 * @author Dell
 *
 */
public class Test76 {
 public static int longestIncreasingSubsquence(int[] nums)
 {
	 int[] dp=new int[nums.length+1];
	 int[] route=new int[nums.length+1];
	 for(int i=1;i<dp.length;i++)
	 {
		dp[i]=1;
		route[i]=i;
	 }
	 
	for(int i=2;i<=nums.length;i++)
	{  
		for(int j=1;j<i;j++)
		{
			if(nums[j-1]<nums[i-1]&&dp[j]+1>dp[i])
			{
				dp[i]=dp[j]+1;
				route[i]=j;
			}	
		}	
	}
	
	int max=0;
	for(int i=0;i<dp.length;i++)
	{
		if(dp[i]>max)
		{
			max=dp[i];
		}
	}
	
	int[] result=new int[max];
	int k=max-1;
	int o=route.length-1;
	while(route[o]!=o||k>=0)
	{
		result[k--]=nums[o-1];
		o=route[o];
	}
	for(int i=0;i<result.length;i++)
		System.out.print(result[i]+" ");
	System.out.println();
	return max;
 }
	public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[n];
        for(int i=0;i<a.length;i++)
        {
        	a[i]=sc.nextInt();
        }
   System.out.println(longestIncreasingSubsquence(a));
	}

}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值