转动态规划:最长递增子序列Longest Increasing Subsequence

Posted aaronhoo

tags:

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

转自:https://www.cnblogs.com/coffy/p/5878915.html

设f(i)表示L中以ai为末元素的最长递增子序列的长度。则有如下的递推方程:

这个递推方程的意思是,在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列最末再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。

public void lis(float[] L)
  
         int n = L.length;
         int[] f = new int[n];//用于存放f(i)值;
         f[0]=1;//以第a1为末元素的最长递增子序列长度为1;
         for(int i = 1;i<n;i++)//循环n-1次
         
                f[i]=1;//f[i]的最小值为1;
                for(int j=0;j<i;j++)//循环i 次
                
                       if(L[j]<L[i]&&f[j]>f[i]-1)
                              f[i]=f[j]+1;//更新f[i]的值。
                
         
        //f[i]的值是以L[i]为结尾的递增子序列的长度,需要求LIS,所以要取其中的最大值。
        return max(f);            
  

 

以上是关于转动态规划:最长递增子序列Longest Increasing Subsequence的主要内容,如果未能解决你的问题,请参考以下文章

算法实践--最长递增子序列(Longest Increasing Subsquence)

leetcode 300. Longest Increasing Subsequence 最长递增子序列 (中等)

算法: 最长递增子序列300. Longest Increasing Subsequence

算法: 最长递增子序列300. Longest Increasing Subsequence

最长递增子序列 (LIS) Longest Increasing Subsequence

[leetcode]300. Longest Increasing Subsequence最长递增子序列