BidirectionalSubsequence 双向子序列

问题

递减子序列和递增子序列的概念相同,但渐变方向相反,递减子序列的元素之间依次递减。

在长度为nn的序列s=[1,n]s = [1,n]中寻找元素s[i]s[i],使得s[1,i]s[1,i]的最长递增子序列和s[i,n]s[i,n]的最长递减子序列,求两段子序列的长度的最大之和。

解法

f(i)f(i)是以s[i]s[i]作为最右边元素的最长递增子序列的长度,g(i)g(i)是以s[i]s[i]作为最左边元素的最长递减子序列的长度。f(i),g(i)f(i), g(i)的状态转移方程见LongestIncreasingSubsequenceLongestIncreasingSubsequence

最后返回max{f(i)+g(i)1}max\{ f(i)+g(i)-1 \}i[1,n]i \in [1,n]),即所有f(i)+g(i)1f(i)+g(i)-1中的最大值,之所以减去11是因为s[1,i]s[1,i]最右边的元素和s[i,n]s[i,n]最左边的元素是同一个元素,重复了因此长度减11。该算法的时间复杂度为O(n2)O(n^2)

源码

BidirectionalSubsequence.h

BidirectionalSubsequence.cpp

测试

BidirectionalSubsequenceTest.cpp

Last updated