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

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

题目介绍

本题是一道经典的动态规划题目,题目要求从两个已排序的数组中按照顺序选取元素,使得选取元素的和尽可能大。

本题有两个实现方案,分别是基于递归和基于迭代的。

递归实现

递归解法的思路是对于数组 A 和数组 B,我们分别考虑选取和不选取它们中的最后一个元素,然后递归求解。递归结束条件是当数组 A 或数组 B 中没有元素时,返回 0。

以下是递归实现的代码:

def max_sum_recursive(arr1, arr2, i, j):
    if i == len(arr1) or j == len(arr2):
        return 0
    if arr1[i] == arr2[j]:
        return arr1[i] + max_sum_recursive(arr1, arr2, i+1, j+1)
    else:
        return max(max_sum_recursive(arr1, arr2, i+1, j), max_sum_recursive(arr1, arr2, i, j+1))

其中,arr1 和 arr2 分别为两个已排序的数组,i 和 j 分别代表当前访问的元素下标。

迭代实现

迭代实现的思路是定义一个二维数组 dp,其中 dp[i][j] 表示从 arr1 的前 i 个元素和 arr2 的前 j 个元素中选取元素的最大和。那么,对于数组 A 和数组 B 中的每个元素,我们可以选择它或不选择它,因此有以下状态转移方程:

if arr1[i-1] == arr2[j-1]:
    dp[i][j] = dp[i-1][j-1] + arr1[i-1]
else:
    dp[i][j] = max(dp[i-1][j], dp[i][j-1])

以下是迭代实现的代码:

def max_sum_iterative(arr1, arr2):
    m, n = len(arr1), len(arr2)
    dp = [[0] * (n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if arr1[i-1] == arr2[j-1]:
                dp[i][j] = dp[i-1][j-1] + arr1[i-1]
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    return dp[m][n]

总结

本题是一道经典的动态规划题目,实现起来比较简单,但需要注意细节。递归实现和迭代实现都可以得到正确的结果,但迭代实现的时间复杂度更小,因此更优秀一些。