📌  相关文章
📜  使得两个元素都不相邻的最大和(1)

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

使得两个元素都不相邻的最大和计算器

在编写程序时,经常需要从一个数组中选择一些数字,并确保选出的数字不能相邻。当然,我们还需要计算选出的数字的最大和。这是一个经典的问题,有多种解法。在这篇文章中,我们将介绍其中的一种解法。

解法

首先,让我们考虑一个简单的问题:如果我们只选择一个数字,那么最大和就是这个数字本身。因此,我们可以定义一个数组 $dp$,其中 $dp[i]$ 表示从前 $i$ 个数字中选择一个数字的最大和。对于数组中的第 $i$ 个数字,我们可以选择前面的一个数字 $dp[i-2]$ 或者不选择前面的数字 $dp[i-1]$。因此,我们可以得到如下的递推公式:

$$dp[i] = \max(dp[i-2]+nums[i], dp[i-1])$$

这个公式表明,我们要么是选择第 $i$ 个数字,要么是不选择第 $i$ 个数字。如果我们选择了第 $i$ 个数字,那么最大和就是前 $i-2$ 个数字中选择一个数字的最大和(因为相邻的数字不能选择),加上第 $i$ 个数字。如果我们不选择第 $i$ 个数字,那么最大和就是前 $i-1$ 个数字中选择一个数字的最大和。

接下来,我们将上述递推公式扩展到选择两个不相邻的数字的情况。我们可以分成两种情况考虑:

  • 第一个数字不选,第二个数字选
  • 第一个数字选,第二个数字不选

对于第一种情况,我们可以使用上述递推公式计算第二个数字的最大和。对于第二种情况,我们需要使用一个类似的递推公式,来计算第一个数字的最大和。然后,我们可以将这两种情况的最大和相加,得到最终的结果。

因此,我们可以得到如下的递推公式:

$$dp[i] = \max(dp[i-2]+nums[i], dp[i-1])$$

$$dp[i] = \max(dp[i-2]+nums[i-1], dp[i-1])$$

$$maxsum = \max(dp[n], dp[n-1])$$

其中,$dp[i]$ 表示前 $i$ 个数字中选择两个不相邻的数字的最大和,$maxsum$ 表示最终的最大和。

代码实现
def max_sum(nums):
    n = len(nums)
    if n == 0:
        return 0
    elif n == 1:
        return nums[0]

    dp = [0] * n
    dp[0] = nums[0]
    dp[1] = max(nums[0], nums[1])

    for i in range(2, n):
        dp[i] = max(dp[i-2]+nums[i], dp[i-1])

    maxsum1 = dp[n-1]

    dp[0] = 0
    dp[1] = nums[1]
    for i in range(2, n):
        dp[i] = max(dp[i-2]+nums[i-1], dp[i-1])

    maxsum2 = dp[n-1]

    return max(maxsum1, maxsum2)
总结

在这篇文章中,我们介绍了如何在一个数组中选择两个不相邻的数字,并计算它们的最大和。我们的解法使用了动态规划的思想,通过递推公式来计算最大和。这是一个经典的问题,有多种解法。我们希望这篇文章能够帮助您更好地理解这个问题,并在编写程序时提供一些参考。