给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。
说明
最长上升子序列的定义:
最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
https://en.wikipedia.org/wiki/Longest_increasing_subsequence
样例
给出 [5,4,1,2,3],LIS 是 [1,2,3],返回 3 和 1 2 3
说明
最长上升子序列的定义:
最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的。
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));
}
}