📅  最后修改于: 2023-12-03 15:35:54.350000             🧑  作者: Mango
给定一个整数数组和一个子序列,求该整数数组中不包含该给定子序列的最长递增子序列的长度。
输入:
nums = [1,3,5,4,7]
excluded = [4,7]
输出:
3
解释:最长递增子序列为[1,3,5],不包含[4,7]子序列。
该问题可以转化为:找到数组中最多可以从中选取多少个数,使得这些数组成的最长的递增子序列中不包含给定子序列。
我们可以使用动态规划的方法来求解该问题。
定义状态 $dp[i]$ 表示以第 $i$ 个数为结尾的最长不包含子序列的长度。
转移方程:对于第 $i$ 个数,首先表示它本身可以构成一个长度为1的递增子序列,因此 $dp[i]=1$,然后从第 $1$ 个数遍历到第 $i-1$ 个数,如果第 $j$ 个数小于第 $i$ 个数并且第 $j$ 个数不在给定的子序列中,那么 $dp[i]$ 就可以更新为 $dp[j]+1$。
最终结果为 $dp$ 数组中的最大值。
时间复杂度为 $O(n^2)$。
def longest_increasing_subsequence(nums, excluded):
n = len(nums)
dp = [1] * n
for i in range(n):
for j in range(i):
if nums[j] < nums[i] and nums[j] not in excluded:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
我们定义一个 test()
函数来校验上述算法的正确性,并对其进行测试:
def test():
nums = [1, 3, 5, 4, 7]
excluded = [4, 7]
assert longest_increasing_subsequence(nums, excluded) == 3
nums = [1, 5, 4, 6, 9, 7, 8]
excluded = [4, 6]
assert longest_increasing_subsequence(nums, excluded) == 4
nums = [3, 4, 1, 5, 2]
excluded = [1, 2]
assert longest_increasing_subsequence(nums, excluded) == 3
test()
如果没有输出,则表示测试通过。
本文提供了一种使用动态规划的方法来求解 “寻找不包含给定序列的最长递增子序列的长度” 的问题。算法的时间复杂度为 $O(n^2)$。