问题
递减子序列和递增子序列的概念相同,但渐变方向相反,递减子序列的元素之间依次递减。
在长度为n的序列s=[1,n]中寻找元素s[i],使得s[1,i]的最长递增子序列和s[i,n]的最长递减子序列,求两段子序列的长度的最大之和。
解法
设f(i)是以s[i]作为最右边元素的最长递增子序列的长度,g(i)是以s[i]作为最左边元素的最长递减子序列的长度。f(i),g(i)的状态转移方程见LongestIncreasingSubsequence。
最后返回max{f(i)+g(i)−1}(i∈[1,n]),即所有f(i)+g(i)−1中的最大值,之所以减去1是因为s[1,i]最右边的元素和s[i,n]最左边的元素是同一个元素,重复了因此长度减1。该算法的时间复杂度为O(n2)。
源码
BidirectionalSubsequence.h
BidirectionalSubsequence.cpp
测试
BidirectionalSubsequenceTest.cpp