码迷,mamicode.com
首页 > 编程语言 > 详细

动态规划_最长不下降子序列 java

时间:2018-06-23 17:05:23      阅读:503      评论:0      收藏:0      [点我收藏+]

标签:ges   tno   序列   长度   esc   数组   png   print   oid   

题目:

给定n个整数组成的序列,求所有不下降子序列中最长的长度。例如{A_n}=3,18,7,14,10,12,23,41,16,24,其中3,18,23,41是一个长度为4不下降子序列,

但3,7,10,12,16,24是一个长度为6的子序列。

发现若A(i)>=A(i-1),以A(i)结尾的最长不下降序列的长度应该为以A(i-1)结尾的最长不下降序列加1。若小于,则从A(i-1)往前找,直到满足A(i)>A(j),此时

最长不下降序列长度为以A(j)结尾的长度加1。创建一个数组记录以各个元素为结尾的最长子序列长度,最后输出最大值。时间复杂度为O(n^2)

public class LongestNondescendantSequence {
    public static void main(String[] args)
    {
        int[] arr=new int[] {3,18,7,14,10,12,23,41,16,24};
        LNS(arr);
    }
    public static void LNS(int[] arr)
    {
        int[] a=new int[arr.length];
        int max=0;
        //单个元素不下降子序列长度不可能小于1,初始化为1
        for(int i=0;i<arr.length;i++)
            a[i]=1;
        for(int i=1;i<arr.length;i++)
        {
            //若当前元素大于上一个元素,则当前元素结尾的不下降子序列长度加1
            if(arr[i]>=arr[i-1])
                a[i]=a[i]+a[i-1];
            //否则的话从前一个元素从后向前寻找小于当前元素的元素,找到后以当前元素为结尾的不下降子序列长度是以找到的元素为结尾的不下降子序列长度加1
            else
            {
                for(int j=i-1;j>=0;j--)
                {
                    if(arr[j]<arr[i])
                    {
                        a[i]=a[j]+1;
                        break;
                    }
                }
            }
        }
        //打印最大长度
        for(int i=0;i<a.length;i++)
        {
            if(a[i]>max)
                max=a[i];    
        }
        System.out.print(max);            
    }
}

打印结果

技术分享图片

 

动态规划_最长不下降子序列 java

标签:ges   tno   序列   长度   esc   数组   png   print   oid   

原文地址:https://www.cnblogs.com/javaStudy947/p/9217407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!