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

📅  最后修改于: 2023-12-03 15:21:30.809000             🧑  作者: Mango

不包含给定序列的最长递增子序列的长度

在一些算法问题中,需要寻找一个最长递增子序列。但是在有些情况下,需要寻找的递增子序列不能包含给定的某些数字。下面介绍一种算法,用于寻找不包含给定序列的最长递增子序列的长度。

算法流程
  1. 定义动态规划数组dp,dp[i]表示以第i个元素结尾的最长递增子序列中不包含给定序列的长度。
  2. 初始化dp数组为1,因为每个元素本身就形成一个递增子序列,长度为1。
  3. 从第二个元素开始遍历数组。设当前元素为nums[i],遍历前面的元素nums[j],如果nums[i]大于nums[j]且不在给定序列中,更新dp[i]的值。即dp[i] = max(dp[i], dp[j]+1)。
  4. 最后,遍历dp数组,找到最大的一个值,即为不包含给定序列的最长递增子序列的长度。
代码实现

以下是算法的Python代码实现:

def longest_increasing_subsequence(nums, exclude):
    n = len(nums)
    dp = [1]*n
    for i in range(1, n):
        for j in range(i):
            if nums[i] > nums[j] and nums[i] not in exclude:
                dp[i] = max(dp[i], dp[j]+1)
    return max(dp)

# 示例
nums = [1, 2, 3, 4, 5, 6, 7]
exclude = [3, 5]
print(longest_increasing_subsequence(nums, exclude)) # output: 5
时间复杂度

由于算法使用了两重循环,因此时间复杂度为O(n^2)。

空间复杂度

使用了长度为n的dp数组,因此空间复杂度为O(n)。

参考资料