在C ++中查找插入0的两个数组的最大点积

假设我们有两个大小为m和n的正整数数组。m> n。我们必须通过在第二个数组中插入零来最大化点积。我们必须记住的一件事是,我们将不会更改给定数组中元素的顺序。假设数组为A = [2,3,1,7,8],另一个数组B = [3,6,7]。输出为107。在第二个数组的第一个和第三个位置插入0后,我们可以最大化点积。因此乘积将为2 * 0 + 3 * 3 +1 * 0 + 7 * 6 + 8 * 7 = 107。

为了解决这个问题,我们将使用动态编程方法。因此,A的大小为m,B的大小为n。我们将为动态编程顺序(n + 1)x(m + 1)创建一个表,并用0填充它。现在使用这些步骤来完成其余工作-

  • 对于范围1至n的i:

    • 对于j:= i至m

    • 对于j:= i至m

    • table [i,j]:= max(table [i-1,j-1] + A [j-1] * B [i-1],table [i,j-1])

    示例

    #include <iostream>
    using namespace std;
    long long int findMaximumDotProd(int A[], int B[], int m, int n) {
       long long int table[n+1][m+1];
       for(int i = 0; i<=n; i++){
          for(int j = 0; j<=m; j++){
             table[i][j] = 0;
          }
       }
       for (int i=1; i<=n; i++)
       for (int j=i; j<=m; j++)
       table[i][j] = max((table[i-1][j-1] + (A[j-1]*B[i-1])) , table[i][j-1]);
       return table[n][m] ;
    }
    int main() {
       int A[] = { 2, 3 , 1, 7, 8 } ;
       int B[] = { 3, 6, 7 } ;
       int m = sizeof(A)/sizeof(A[0]);
       int n = sizeof(B)/sizeof(B[0]);
       cout << "Maximum dot product: " << findMaximumDotProd(A, B, m, n);
    }

    输出结果

    Maximum dot product: 107