给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
输入格式:
输入有两行:
第一行是n值(1<=n<=10000);
第二行是n个整数。
输出格式:
输出最大子段和。
输入样例:
在这里给出一组输入。例如:
6
-2 11 -4 13 -5 -2
输出样例:
在这里给出相应的输出。例如:
20
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
n = int(input())
nums = list(map(int, input().split()))
curSum = 0
maxSum = nums[0]
for i in range(n):
curSum += nums[i]
if curSum > maxSum:
maxSum = curSum
if curSum < 0:
curSum = 0
if all(num < 0 for num in nums):
maxSum = 0
print(maxSum)
该问题可以使用Kadane算法(卡登算法)求解,时间复杂度为O(n)。
Kadane算法是一种连续子序列最大和的动态规划算法,具体而言,我们可以定义一个变量curSum表示当前的最大子段和,一个变量maxSum表示全局最大子段和。然后,对于每一个数字来说,我们可以选择将其加入到当前的子段中,或者以该数字开始新的子段。因此,我们可以使用以下状态转移方程:
curSum = max(curSum + nums[i], nums[i]) maxSum = max(maxSum, curSum)
其中,nums[i]表示第i个数字,curSum表示当前的最大子段和,maxSum表示全局最大子段和。如果将第i个数字加入到当前的子段中可以使得子段和更大,那么我们就将其加入,否则,我们就以第i个数字开始新的子段。最终,maxSum即为所求的全局最大子段和。