📌  相关文章
📜  不包含给定序列的最长递增子序列的长度作为子数组(1)

📅  最后修改于: 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)$。