📜  门|门 IT 2005 |第 88 题(1)

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

题目概述

本题出自"门|门 IT 2005",为算法题第88题。该题需要设计一种算法,对于给定的数列,寻找其中的“最长单调不降子序列长度”,并输出该长度。

题目详解

问题描述

给出一个不限长度的数字序列,要求设计一个算法,能够找到该序列中的最长单调不降子序列,并求出该子序列的长度。

例如,对于序列 {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},其最长单调不降子序列为 {1, 2, 5, 5},长度为 4。

解题思路

本题可以使用“动态规划”的思路进行求解。

具体来说,我们可以定义一个数组 dp[i],表示以第 i 个元素为结尾的最长单调不降子序列的长度。

对于第 i 个元素,其可能会对 dp[i] 产生影响的情况有两种:

  1. 该元素之前的某一个元素 j,比 i 大,但是 j 是单调不降子序列中的最后一个元素,此时 dp[i] = dp[j] + 1;
  2. 该元素之前的某一个元素 j,比 i 小,则 i 不能加入 j 所在的单调不降子序列中,所以 dp[i] = dp[i-1]。

最后遍历完整个序列后,dp 数组中的最大值,即为最长单调不降子序列的长度。

代码实现
def longest_increasing_subsequence(nums):
    n = len(nums)
    dp = [1] * n
    for i in range(n):
        for j in range(i):
            if nums[j] <= nums[i]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)
测试样例
Input
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
Output
4

总结

本题是一道经典的动态规划问题。虽然看上去复杂,但是只需按照规定的思路进行分析和实现,即可得到正确的答案。这也提醒了我们,学好算法,关键在于要掌握一定的思考和分析能力。