📅  最后修改于: 2023-12-03 15:35:55.470000             🧑  作者: Mango
给定一个长度为n的数组nums和一个非负整数K,您需要找到该数组中不超过K的所有非相邻元素的最大可能总和。
例如,给定数组[3, 2, 5, 10, 7]和K为2,最大可能总和是13,因为我们可以选择元素3和10来达到这个总和,这些元素不相邻。
为了解决这个问题,我们需要设计一个动态规划算法。我们定义dp[i][0]表示不选第i个元素的最大可能总和,dp[i][1]表示选第i个元素的最大可能总和。
对于dp[i][0],我们可以选择不选第i个元素,那么它的值等于max(dp[i-1][0], dp[i-1][1]),如果选择第i个元素,那么它的值等于dp[i-1][0] + nums[i]。
对于dp[i][1],我们只能选择不选第i-1个元素,因为相邻元素不能同时选择。那么它的值等于dp[i-1][0] + nums[i]。
最终的最大可能总和就是max(dp[n-1][0], dp[n-1][1])。
下面是Python语言的算法实现:
def max_sum(nums: List[int], k: int) -> int:
n = len(nums)
if n == 0:
return 0
if n == 1:
return nums[0] if nums[0] <= k else 0
dp = [[0, 0] for _ in range(n)]
dp[0][1] = nums[0] if nums[0] <= k else 0
for i in range(1, n):
dp[i][0] = max(dp[i-1][0], dp[i-1][1])
if nums[i] <= k:
dp[i][1] = dp[i-1][0] + nums[i]
return max(dp[n-1][0], dp[n-1][1])
时间复杂度为O(n),空间复杂度为O(n),其中n是数组的长度。算法需要维护一个二维数组用于存储动态规划过程中的状态。