转动态规划:最长递增子序列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