📌  相关文章
📜  不超过 K 的非相邻数组元素的最大可能总和(1)

📅  最后修改于: 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是数组的长度。算法需要维护一个二维数组用于存储动态规划过程中的状态。