📌  相关文章
📜  按顺序从两个数组中选取元素的最大总和 | 2套(1)

📅  最后修改于: 2023-12-03 15:39:49.351000             🧑  作者: Mango

题目

给定两个数组 nums1 和 nums2 。请选出元素和最大的序列使得该序列是由 nums1 和 nums2 中连续的若干个数字按顺序组成的,同时该序列中不能包含来自同一个数组的相邻的数字。

解题思路

题目要求我们选择两个数组中的数,按照顺序构建一个序列,并且这个序列中不能有来自同一个数组的相邻数字。因此,我们需要根据题意进行分类讨论,构建 dp 状态转移方程。

首先,我们定义 dp 数组,其中 dp[i][0] 表示从两个数组中选取元素的最大总和,使得最后一个元素来自 nums1[i],dp[i][1] 表示来自 nums2[i]。那么问题就变成了如何转移这个二维数组。

对于 dp[i][0],有两种情况:

  1. 我们不选取当前 nums1[i],那么 dp[i][0] 就是 dp[i-1][1],因为当前不能选取 nums2 数组中的相邻数字。
  2. 我们选取当前的 nums1[i],那么 dp[i][0] 就是 dp[i-2][1] + nums1[i],因为如果选择了 nums1[i],那么上一个数只能是来自 nums2 数组的数字。

对于 dp[i][1],同样也有两种情况:

  1. 我们不选取当前的 nums2[i],那么 dp[i][1] 就是 dp[i-1][0],因为当前不能选取 nums1 数组中的相邻数字。
  2. 我们选取当前的 nums2[i],那么 dp[i][1] 就是 dp[i-2][0] + nums2[i],因为如果选择了 nums2[i],那么上一个数只能是来自 nums1 数组的数字。

最终,我们的答案就是 dp[len(nums1)-1][0] 和 dp[len(nums2)-1][1] 中的最大值,因为最后一个数必须来自其中一个数组。

代码实现
def maxSum(nums1: List[int], nums2: List[int]) -> int:
    n1, n2 = len(nums1), len(nums2)
    dp = [[0, 0] for _ in range(max(n1, n2) + 1)]
    for i in range(1, n1 + 1):
        dp[i][0] = max(dp[i-1][1], dp[i-2][1] + nums1[i-1])
    for i in range(1, n2 + 1):
        dp[i][1] = max(dp[i-1][0], dp[i-2][0] + nums2[i-1])
    return max(dp[n1][0], dp[n2][1])

返回结果为 markdown 格式:

## 题目

给定两个数组 nums1 和 nums2 。请选出元素和最大的序列使得该序列是由 nums1 和 nums2 中连续的若干个数字按顺序组成的,同时该序列中不能包含来自同一个数组的相邻的数字。

## 解题思路

题目要求我们选择两个数组中的数,按照顺序构建一个序列,并且这个序列中不能有来自同一个数组的相邻数字。因此,我们需要根据题意进行分类讨论,构建 dp 状态转移方程。

首先,我们定义 dp 数组,其中 dp[i][0] 表示从两个数组中选取元素的最大总和,使得最后一个元素来自 nums1[i],dp[i][1] 表示来自 nums2[i]。那么问题就变成了如何转移这个二维数组。

对于 dp[i][0],有两种情况:

1. 我们不选取当前 nums1[i],那么 dp[i][0] 就是 dp[i-1][1],因为当前不能选取 nums2 数组中的相邻数字。
2. 我们选取当前的 nums1[i],那么 dp[i][0] 就是 dp[i-2][1] + nums1[i],因为如果选择了 nums1[i],那么上一个数只能是来自 nums2 数组的数字。

对于 dp[i][1],同样也有两种情况:

1. 我们不选取当前的 nums2[i],那么 dp[i][1] 就是 dp[i-1][0],因为当前不能选取 nums1 数组中的相邻数字。
2. 我们选取当前的 nums2[i],那么 dp[i][1] 就是 dp[i-2][0] + nums2[i],因为如果选择了 nums2[i],那么上一个数只能是来自 nums1 数组的数字。

最终,我们的答案就是 dp[len(nums1)-1][0] 和 dp[len(nums2)-1][1] 中的最大值,因为最后一个数必须来自其中一个数组。

## 代码实现

```python
def maxSum(nums1: List[int], nums2: List[int]) -> int:
    n1, n2 = len(nums1), len(nums2)
    dp = [[0, 0] for _ in range(max(n1, n2) + 1)]
    for i in range(1, n1 + 1):
        dp[i][0] = max(dp[i-1][1], dp[i-2][1] + nums1[i-1])
    for i in range(1, n2 + 1):
        dp[i][1] = max(dp[i-1][0], dp[i-2][0] + nums2[i-1])
    return max(dp[n1][0], dp[n2][1])