问题描述:给出n个数,求出其最长不下降子序列的长度,比如n=5,5个数是{4,6,5,7,3};其最长下降子序列就是{4,6,7},长度为3。
一、简单的O(n^2)的算法
很容易想到用动态规划做。设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i>j。然后在lis[]中找到最大的一个值,时间复杂度是O(n^2)。
public class Longest_sequence {
public void Longest_sequence(int[] arr)
{
int[] n=new int[arr.length];
for(int i=0;i<arr.length;i++)
{
n[i]=1;
for(int j=1;j<i;j++)
{
if(n[i]<=n[j]&&arr[i]>arr[j])
{
n[i]=n[j]+1;
}
else if(n[i]<n[j]&&arr[i]<=arr[j])
{
n[i]=n[i-1];
}
}
}
int max=0;
for(int m=0;m<arr.length;m++)
{
if(max<n[m])
max=n[m];
}
System.out.println("max value is "+max);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Longest_sequence ls=new Longest_sequence();
int[] a={3,18,7,14,10,12,23,41,16,24};
ls.Longest_sequence(a);
}
}