📜  门| GATE-CS-2007 |第 30 题(1)

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

题目描述

给定一个长度为n的整数序列,你需要找到一个连续的子序列,使得该子序列的元素和最大。你需要输出这个最大的子序列和。

输入格式

第一行包含一个整数n,表示数字序列的长度。

第二行包含n个整数,分别表示整数序列中的每个数字。

输出格式

输出一个整数,表示最大的子序列和。

输入样例

5
1 2 3 -2 5

输出样例

9

算法思路

使用动态规划算法。设max[i]为以第i个数字结尾的最大子序列和,则有以下状态转移方程:

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

其中,nums表示输入的整数序列。

代码实现

def max_subarray(nums):
    max_sum = nums[0]
    cur_sum = 0
    for num in nums:
        cur_sum = max(cur_sum + num, num)
        max_sum = max(max_sum, cur_sum)
    return max_sum

n = int(input())
nums = list(map(int, input().split()))
print(max_subarray(nums))

时间复杂度

代码中使用了一次循环,每次操作的时间都是常数级别的,因此时间复杂度为O(n)。