📅  最后修改于: 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
本题采用动态规划的思想,需要对状态转移方程进行修改。代码实现较为简单,但需要注意一些细节问题。