码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-30 20:42:30      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:++   tps   规划   ret   off   有一个   pre   turn   html   

转自: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

标签:++   tps   规划   ret   off   有一个   pre   turn   html   

原文地址:https://www.cnblogs.com/aaronhoo/p/11436845.html

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