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

Posted yfyfyf947

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划_最长不下降子序列 java相关的知识,希望对你有一定的参考价值。

题目:

给定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的主要内容,如果未能解决你的问题,请参考以下文章

动态规划|蒜头君跳木桩-最长下降子序列

动态规划|删除最少的元素-最长下降子序列

用数学语言说一下动态规划求数列最长递增子序列的解

动态规划——最长不下降子序列(LIS)

网络流24题最长不下降子序列(最大流,动态规划)

HDU 1160 FatMouse's Speed (动态规划最长下降子序列)