📜  两列乘积的最大和(1)

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

两列乘积的最大和

介绍

本题目给定一个二维数组 nums,其中 nums[i][j] 表示第i行第j列的数值,你需要从第一列中选择一个数,并从第二列中选择一个数,使得它们的乘积之和最大,返回最大值。

示例

输入:

nums = [[1, 2], [3, 4]]

输出:

12

解释:

选择第一列的2和第二列的4,乘积之和为2 * 4 = 8。

解法

我们可以用一个一维数组来保存到当前列的最大值,具体操作如下:

  1. 初始化一个长度为n的一维数组dp,记录到当前列的最大值,其中n为二维数组的行数。

  2. 对于每一列j,遍历第一列i,求出dp[i] + nums[i][j]的值,取其中的最大值赋值给dp[i]。

  3. 返回dp中最大的值,即为最大乘积之和。

代码实现如下:

def max_product(nums):
    n = len(nums)
    dp = [nums[i][0] for i in range(n)]
    for j in range(1, len(nums[0])):
        for i in range(n):
            dp[i] = max(dp[i] * nums[i][j], nums[i][j])
        for i in range(1, n):
            dp[i] = max(dp[i], dp[i - 1])
    return dp[-1]

代码解释:

  • 第二行初始化了一个长度为n的dp数组,初始值为二维数组第一列的值。

  • 外层循环遍历了除了第一列之外的所有列。

  • 内层循环遍历了所有的行,对dp数组进行更新。假设当前在第j列第i行,那么就取dp[i] * nums[i][j]和nums[i][j]的最大值赋值给dp[i]。

  • 遍历完第j列后,需要对dp数组进行一次更新,把dp数组中相邻两个数中的较大值赋值给右边的数,以保证下一次乘积时能够正确计算。

  • 最后返回dp中的最大值即可。

总结

本题目的思路是用dp数组记录到当前列的最大值,然后依次遍历每一列,更新dp数组。难度不算过高,适合初学者。