📌  相关文章
📜  圆形数组中的最大和,以使没有两个元素相邻(1)

📅  最后修改于: 2023-12-03 14:50:49.880000             🧑  作者: Mango

圆形数组中的最大和,以使没有两个元素相邻

在一个圆形数组中找到一组数,使得这组数的和最大,同时要求这些数不能相邻。比如,给出一个数组 [2, 5, -3, -4, 6],则找到的最大和为 11,由 2、-3 和 6 组成。

思路

这道题可以使用动态规划来解决。设 $dp_i$ 表示以 $i$ 为结尾的最大和,则有以下转移方程:

$$ dp_i = \begin{cases} 0, & i = 0 \ \max{dp_{i-1}, a_i, dp_{i-2}+a_i}, & i = 1, 2, \dots, n-1 \ \max{dp_{i-1}, dp_{i-2}}, & i = n \end{cases} $$

其中 $a_i$ 是数组中第 $i$ 个数。

注意,这里的数组是一个圆形数组,所以当 $i = n$ 时,需要考虑最后一个数和第一个数是否相邻。

代码

以下是 Python 代码片段:

def max_sum(a):
    n = len(a)
    if n == 1:
        return a[0]
    dp = [0] * n
    dp[0] = 0
    dp[1] = max(0, a[1])
    for i in range(2, n):
        dp[i] = max(dp[i-1], a[i], dp[i-2]+a[i])
    ans = dp[n-1]
    dp[0] = a[0]
    dp[1] = max(a[0], a[1])
    for i in range(2, n-1):
        dp[i] = max(dp[i-1], a[i]+dp[i-2], dp[i-2])
    ans = max(ans, dp[n-2])
    return ans
测试

我们可以使用以下代码进行测试:

assert max_sum([2, 5, -3, -4, 6]) == 11
assert max_sum([5, 1, 2, 4, 6, 8, 1]) == 17
assert max_sum([5, 1, 2, 4, 6, 8]) == 16
assert max_sum([1, 2, 4, 6, 8]) == 12
assert max_sum([2, 4, 6, 8]) == 12
assert max_sum([1, 3, 1, 3, 100]) == 103
总结

本题使用动态规划,时间复杂度为 $O(n)$。值得注意的是,当数组长度为 1 时,直接返回该数即可。