📌  相关文章
📜  国际空间研究组织 | ISRO CS 2007 |问题 54(1)

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

国际空间研究组织 | ISRO CS 2007 |问题 54

问题描述

给定一个大小为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))