📌  相关文章
📜  2 xn 网格中的最大总和,使得没有两个元素相邻(1)

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

题目描述

给定一个 $2\times n$ 的网格,每个格子里的数都是整数,现在需要选择其中一些格子,使得这些格子的和最大,但是不能选择相邻的格子。请你求出最大的和是多少。

算法思路

我们可以采用动态规划来解决这个问题。设 $dp[i]$ 表示考虑前 $i$ 列,且一定选择第 $i$ 列的最大和。则对于第 $i$ 列,我们有两种决策:

  1. 如果不选第 $i$ 列,则最大和为 $dp[i-1]$。

  2. 如果选第 $i$ 列,则最大和为 $dp[i-2]$ 加上第 $i$ 列的所有元素之和。

综上所述,我们可以得到状态转移方程:

$$ dp[i] = \max(dp[i-1], dp[i-2] + \sum_{j=1}^2 a_{j,i}) $$

其中 $a_{j,i}$ 表示第 $j$ 行第 $i$ 列的元素。

最终的答案即为 $dp[n]$。

代码实现

def max_sum(n: int, grid: List[List[int]]) -> int:
    dp = [0] * (n+1) # 初始化 DP 数组
    for i in range(1, n+1):
        if i == 1:
            dp[i] = max(grid[0][0], grid[1][0])
        else:
            dp[i] = max(dp[i-1], dp[i-2] + sum(grid[j][i-1] for j in range(2)))
    return dp[n]

复杂度分析

  • 时间复杂度:$O(n)$,其中 $n$ 表示网格的列数,我们需要对每一列进行一次 DP 状态转移。

  • 空间复杂度:$O(n)$,我们需要开一个数组来保存 DP 状态。