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

给定一个整数序列,找到最长上升子序列(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;idp[i])
			{
				dp[i]=dp[j]+1;
				route[i]=j;
			}	
		}	
	}
	
	int max=0;
	for(int i=0;imax)
		{
			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


你可能感兴趣的:(LeetCode,LeetCode)