📜  门|门CS 2012 |问题 9(1)

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

题目介绍

本题为“门门CS 2012”的第9题,是一道经典的算法题目,要求程序员实现一个函数,计算出给定一串数列中连续子序列的最大和。

解题思路

首先,我们可以用动态规划的思路来解决这个问题。我们定义一个数组dp,其中dp[i]表示以第i个数字为结尾的最大子序列和。那么对于第i个数字来说,它只有两种选择:

  1. 加上前面的子序列,得到更大的值;
  2. 自成一个序列,不和前面的数字相加。

因此,我们可以写出状态转移方程:

dp[i] = max(dp[i-1] + nums[i], nums[i])

其中,nums为给定的原始数列。

我们还需要注意一下边界条件,即当i为0时,dp[i]应该等于nums[i]。因为此时以第i个数字为结尾的子序列只能是它自己。

最后,我们只需要扫描所有的dp[i],找出其中的最大值,即为所求的最大子序列和。

代码实现

def max_subsequence_sum(nums: List[int]) -> int:
    n = len(nums)
    dp = [0] * n
    dp[0] = nums[0]
    for i in range(1, n):
        dp[i] = max(dp[i-1] + nums[i], nums[i])
    return max(dp)

测试样例

assert max_subsequence_sum([1, -2, 3, 10, -4, 7, 2, -5]) == 18
assert max_subsequence_sum([-1, -2, -3, -4, -5]) == -1
assert max_subsequence_sum([]) == 0
assert max_subsequence_sum([1, 2, 3, 4, 5]) == 15

以上就是本题的介绍和解题思路,希望对大家有所帮助!