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

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

题目介绍

给定一个序列,要求求出不包含给定序列作为子数组的最长递增子序列的长度。

解题思路

首先我们可以使用动态规划,定义一个数组$dp$,$dp_i$表示以第$i$个元素结尾的最长递增子序列的长度。那么状态转移方程为:

$dp_i=\max\limits_{0 \le j<i, a_j<a_i}{dp_j+1}$

意思是以第$i$个元素结尾的最长递增子序列等于它前面所有比$a_i$小的元素的最长递增子序列长度$+1$。

但是这样的话我们只是能求出最长递增子序列的长度,并不能排除其中包含给定序列作为子数组的情况。所以我们需要对状态转移方程进行修改:在求$dp_i$时,判断一下$a_i$是否存在于给定的序列中,如果存在,则该状态转移方程失效,需要重新定义当前元素的最长递增子序列长度为$1$。

代码实现

以下是用Python实现的代码:

def longest_increasing_subsequence(nums, exclude):
    """
    求不包含exclude作为子数组的最长递增子序列的长度
    :param nums: 序列
    :param exclude: 给定序列
    :return: 不包含exclude作为子数组的最长递增子序列的长度
    """
    n = len(nums)
    dp = [1] * n
    for i in range(1, n):
        for j in range(i):
            if nums[j] < nums[i] and nums[i] not in exclude:
                dp[i] = max(dp[i], dp[j]+1)
            else:
                dp[i] = 1
    return max(dp)
测试样例

以下是一些测试样例:

输入:[1, 3, 2, 4, 5, 2, 6], [2]

输出:5

输入:[4, 3, 2, 1], [1, 2, 3, 4]

输出:0

输入:[1, 2, 3, 4], [3, 4]

输出:2

输入:[1, 2, 3, 4], []

输出:4

总结

本题采用动态规划的思想,需要对状态转移方程进行修改。代码实现较为简单,但需要注意一些细节问题。