📅  最后修改于: 2023-12-03 15:10:22.845000             🧑  作者: Mango
在一个数组中,边界元素是指第一个元素和最后一个元素。现在给定一个数组,要求找出数组所有可能的边界元素组成的最长递增序列。
给定一个长度为 $n (1 \leq n \leq 10^5)$ 的数组 $a$,$a_i$ 表示这个数组中第 $i$ 个元素的值。请编写一个函数,找出所有可能的边界元素组成的最长递增序列的长度。
如果该数组只有一个元素,那么这个数组的所有元素都是边界元素,最长递增序列长度为 $1$。
将问题转化为求该数组的最长公共上升子序列长度。即求出原数组正序和倒序两个序列的最长上升子序列之和减一,其中减一是因为正序和倒序的重叠部分被重复计算了。
具体实现可使用动态规划,时间复杂度为 $O(n^2)$。
def LIS(a: list) -> int:
"""
求最长上升子序列的长度
"""
n = len(a)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if a[j] < a[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
def boundaryLIS(a: list) -> int:
"""
求边界元素可能的最长递增序列长度
"""
inc_len = LIS(a)
rev_inc_len = LIS(a[::-1])
return inc_len + rev_inc_len - 1
assert boundaryLIS([1, 2, 3, 4, 3, 4, 5, 6, 7]) == 7
assert boundaryLIS([1, 2, 3, 4, 5]) == 5
assert boundaryLIS([5, 4, 3, 2, 1]) == 1