📅  最后修改于: 2023-12-03 15:37:13.788000             🧑  作者: Mango
给定一个大小为n (3≤n≤5000) 的整数数组a,找到数组中不包含两个相邻元素的最大子数组和。
第一行包含一个整数n。 接下来一行包含n个整数,表示整数数组a。
输出一个整数,表示最大的子数组和。
输入:
4
3 2 5 10
输出:
13
这是一个经典的动态规划问题,我们可以用dp[i]表示以第i个元素结尾的不包含相邻元素的最大子数组和。那么,对于以第i个元素结尾的子数组,要么包含i-1,要么不包含i-1。如果包含i-1,那么就不能包含i-2,所以最大子数组和为dp[i-2]+a[i];如果不包含i-1,那么最大子数组和为dp[i-1]。所以dp[i] = max(dp[i-2]+a[i], dp[i-1])。
最终的答案就是max(dp[0], dp[1], ..., dp[n-1])。
时间复杂度:O(n)
空间复杂度:O(n)
def max_subarray_sum(n, a):
if n == 0:
return 0
if n == 1:
return a[0]
dp = [0] * n
dp[0] = a[0]
dp[1] = max(a[0], a[1])
for i in range(2, n):
dp[i] = max(dp[i-2]+a[i], dp[i-1])
return max(dp)
n = int(input())
a = list(map(int, input().split()))
print(max_subarray_sum(n, a))
返回的代码片段:```python def max_subarray_sum(n, a): if n == 0: return 0 if n == 1: return a[0] dp = [0] * n dp[0] = a[0] dp[1] = max(a[0], a[1]) for i in range(2, n): dp[i] = max(dp[i-2]+a[i], dp[i-1]) return max(dp)
n = int(input()) a = list(map(int, input().split())) print(max_subarray_sum(n, a))