📅  最后修改于: 2023-12-03 14:49:35.987000             🧑  作者: Mango
在一个数字数组中,选择若干个数,使得它们的和最大,同时不能选相邻的数字。这个问题可以通过动态规划来解决。
我们设$dp[i]$为前$i$个数使得没有相邻元素的最大和,则状态转移方程如下:
$$dp[i] = \max{dp[i-1], dp[i-2]+nums[i]}$$
其中,$dp[i-1]$表示前$i-1$个数中使得没有相邻元素的最大和,即不选第$i$个数,$dp[i-2]+nums[i]$表示前$i-2$个数中使得没有相邻元素的最大和加上第$i$个数,即选第$i$个数。
def maxSum(nums: List[int]) -> int:
n = len(nums)
if n == 0:
return 0
elif n == 1:
return nums[0]
dp = [0] * n
dp[0], dp[1] = nums[0], max(nums[0], nums[1])
for i in range(2, n):
dp[i] = max(dp[i-1], dp[i-2]+nums[i])
return dp[-1]
这个问题是动态规划中比较典型的例子之一,通过状态定义、状态转移方程以及边界条件的定义,可以比较容易地求解问题。在实际应用中,可以采用滚动数组或者状态压缩等技巧来优化空间复杂度。