📅  最后修改于: 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] 产生影响的情况有两种:
最后遍历完整个序列后,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)
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
4
本题是一道经典的动态规划问题。虽然看上去复杂,但是只需按照规定的思路进行分析和实现,即可得到正确的答案。这也提醒了我们,学好算法,关键在于要掌握一定的思考和分析能力。