📅  最后修改于: 2023-12-03 14:59:03.590000             🧑  作者: Mango
给定一个 $2\times n$ 的网格,每个格子里的数都是整数,现在需要选择其中一些格子,使得这些格子的和最大,但是不能选择相邻的格子。请你求出最大的和是多少。
我们可以采用动态规划来解决这个问题。设 $dp[i]$ 表示考虑前 $i$ 列,且一定选择第 $i$ 列的最大和。则对于第 $i$ 列,我们有两种决策:
如果不选第 $i$ 列,则最大和为 $dp[i-1]$。
如果选第 $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 状态。