📌  相关文章
📜  最长子序列,第一个元素和最后一个元素大于所有其他元素(1)

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

最长子序列,第一个元素和最后一个元素大于所有其他元素

介绍

最长子序列是指在一个序列中选出若干个数,这些数在原序列中保持相对顺序不变,并且这些数之和最大。本题要求在一个序列中找到最长的子序列,且其第一个元素和最后一个元素大于所有其他元素,即“单调性”。

解题思路

题目要求的单调性可以转化为:对于任意 i, j(i < j),如果 a[i] < a[j],则 i 位置前的所有数都小于 a[i],j 位置后的所有数小于 a[j]。因此可以使用动态规划。

用 dp[i] 表示以 i 为结尾的最长单调递增序列长度,状态转移方程为:

if nums[i] > nums[j]:
    dp[i] = max(dp[i], dp[j] + 1)

枚举 j,将 i 位置加入 j 位置的递增序列中,若能得到更长的递增序列,更新 dp[i]。

最终,返回 dp 序列中的最大值,即为所求的最长单调递增序列长度。

代码实现
def find_length_of_LIS(nums: List[int]) -> int:
    n = len(nums)
    if n < 2:
        return n

    dp = [1] * n
    for i in range(1, n):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)

    return max(dp)
总结

本题要求一个数列中第一个元素和最后一个元素大于其他所有元素的最长子序列长度,可以利用动态规划来解决。使用 dp[i] 表示以 i 为结尾的最长单调递增序列长度,通过枚举 j,判断是否能将 i 加入 j 的递增序列中,更新 dp[i]。最终,返回 dp 序列中的最大值,即为所求的最长单调递增序列长度。