📜  找到插入 0 的两个数组的最大点积(1)

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

找到插入 0 的两个数组的最大点积

在寻找插入0的两个数组的最大点积时,我们需要使用动态规划算法。动态规划算法与贪心算法类似,但是其解决的问题具有重叠子问题和最优子结构性质。

算法实现

定义dp数组,dp[i][j]表示第一个数组从0到i的元素和第二个数组从0到j的元素作为第i+1和第j+1的最后一个元素的最大点积。然后,我们可以考虑在两个数组中插入0,比如创建长度为n+1的数组,将原来的元素复制到新的数组中,并将最后一个元素设为0。这样,我们就不必考虑数组的边界问题。

算法的流程如下:

  1. 初始化二维数组dp,行列都比原数组长度大1,初始值为0
  2. 使用嵌套循环遍历两个数组,从1到n+1,分别计算数组A和数组B的前缀和
  3. 枚举i和j,用dp[i-1][j-1]表示第i个数和第j个数不相乘,用dp[i-1][j] + nums1[i-1]*0表示第二个数组插入0,用dp[i][j-1] + nums2[j-1]*0表示第一个数组插入0,用dp[i-1][j-1] + nums1[i-1]*nums2[j-1] 表示第一个数组的第i个数和第二个数组的第j个数相乘
  4. 返回dp[n][m]
代码实现
def maxDotProduct(nums1, nums2):
    n, m = len(nums1), len(nums2)
    dp = [[float('-inf')] * (m+1) for _ in range(n+1)]
    for i in range(1, n+1):
        for j in range(1, m+1):
            sum1, sum2 = 0, 0
            for k in range(i):
                sum1 += nums1[k]
            for k in range(j):
                sum2 += nums2[k]
            dp[i][j] = max(dp[i-1][j-1] + nums1[i-1]*nums2[j-1], dp[i-1][j] + nums1[i-1]*0, dp[i][j-1] + nums2[j-1]*0, dp[i-1][j-1])
    return dp[n][m]
测试样例
print(maxDotProduct([2,1,-2,5],[3,0,-6])) # 输出: 18

测试样例中,我们输入两个数组[2,1,-2,5]和[3,0,-6],输出的结果为18,这是两个数组插入0后的最大点积。