📌  相关文章
📜  数组中的最大设置位总和,不考虑相邻元素(1)

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

数组中的最大设置位总和,不考虑相邻元素

题目描述:给定一个由非负整数组成的数组,您的任务是计算可以通过设置每个数组元素中的位来获得的最大位总和,该位与任何相邻元素都不相邻。

例如,数组 [0, 2, 2, 0, 4, 3, 1, 2] 的最大位总和为 13。在这种情况下,通过将第一个元素更改为 2、第四个元素更改为 4、第六个元素更改为 5 并将最后一个元素更改为 3 可以获得此最大位总和 。

思路

本题要求得到一个数组中不相邻元素的最大设置位总和,可以使用动态规划来解决。令dp[i]表示前i个数字中,以第i个数字结尾的元素对应二进制位置为1的最大设置位总和。

对于第i个数字,它有两种情况:

  • 不选:此时dp[i] = dp[i-1]
  • 选:此时dp[i] = dp[i-2] + sum[i-1],其中sum[i-1]表示前i-1个数字中,所有数字对应二进制位上为1的总和。

最终答案即为max(dp[l-1], dp[l-2]),其中l是数组长度。

代码实现
class Solution:
    def getMaximumGenerated(self, n: int) -> int:
        if n == 0:
            return 0
        dp = [0] * (n+1)
        dp[1] = 1
        for i in range(2, n+1):
            if i % 2 == 0:
                dp[i] = dp[i//2]
            else:
                dp[i] = dp[i//2] + dp[i//2+1]
        return max(dp)
复杂度分析

时间复杂度:O(n),其中n是数组的长度。

空间复杂度:O(n),需要使用长度为n+1的数组记录各个状态。