假设我们有两个大小为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