给定两个大小为 m 和 n 的正整数数组,其中 m > n。我们需要通过在第二个数组中插入零来最大化点积,但我们不能扰乱元素的顺序。
例子:
Input : A[] = {2, 3 , 1, 7, 8}
B[] = {3, 6, 7}
Output : 107
Explanation : We get maximum dot product after
inserting 0 at first and third positions in
second array.
Maximum Dot Product : = A[i] * B[j]
2*0 + 3*3 + 1*0 + 7*6 + 8*7 = 107
Input : A[] = {1, 2, 3, 6, 1, 4}
B[] = {4, 5, 1}
Output : 46
提问:Directi 面试
看待这个问题的另一种方式是,对于每对元素元素 A[i] 和 B[j] 其中 j >= i ,我们有两个选择:
- 我们将 A[i] 和 B[j] 相乘并添加到乘积(我们包括 A[i])。
- 我们从产品中排除 A[i](换句话说,我们在 B[] 的当前位置插入 0)
这个想法是使用动态编程。
1) Given Array A[] of size 'm' and B[] of size 'n'
2) Create 2D matrix 'DP[n + 1][m + 1]' initialize it
with '0'
3) Run loop outer loop for i = 1 to n
Inner loop j = i to m
// Two cases arise
// 1) Include A[j]
// 2) Exclude A[j] (insert 0 in B[])
dp[i][j] = max(dp[i-1][j-1] + A[j-1] * B[i -1],
dp[i][j-1])
// Last return maximum dot product that is
return dp[n][m]
下面是上述想法的实现。
C++
// C++ program to find maximum dot product of two array
#include
using namespace std;
// Function compute Maximum Dot Product and
// return it
long long int MaxDotProduct(int A[], int B[],
int m, int n)
{
// Create 2D Matrix that stores dot product
// dp[i+1][j+1] stores product considering B[0..i]
// and A[0...j]. Note that since all m > n, we fill
// values in upper diagonal of dp[][]
long long int dp[n+1][m+1];
memset(dp, 0, sizeof(dp));
// Traverse through all elements of B[]
for (int i=1; i<=n; i++)
// Consider all values of A[] with indexes greater
// than or equal to i and compute dp[i][j]
for (int j=i; j<=m; j++)
// Two cases arise
// 1) Include A[j]
// 2) Exclude A[j] (insert 0 in B[])
dp[i][j] = max((dp[i-1][j-1] + (A[j-1]*B[i-1])) ,
dp[i][j-1]);
// return Maximum Dot Product
return dp[n][m] ;
}
// Driver program to test above function
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 << MaxDotProduct(A, B, m, n);
return 0;
}
Java
// Java program to find maximum
// dot product of two array
import java.util.*;
class GFG
{
// Function to compute Maximum
// Dot Product and return it
static int MaxDotProduct(int A[], int B[], int m, int n)
{
// Create 2D Matrix that stores dot product
// dp[i+1][j+1] stores product considering B[0..i]
// and A[0...j]. Note that since all m > n, we fill
// values in upper diagonal of dp[][]
int dp[][] = new int[n + 1][m + 1];
for (int[] row : dp)
Arrays.fill(row, 0);
// Traverse through all elements of B[]
for (int i = 1; i <= n; i++)
// Consider all values of A[] with indexes greater
// than or equal to i and compute dp[i][j]
for (int j = i; j <= m; j++)
// Two cases arise
// 1) Include A[j]
// 2) Exclude A[j] (insert 0 in B[])
dp[i][j] =
Math.max((dp[i - 1][j - 1] +
(A[j - 1] * B[i - 1])), dp[i][j - 1]);
// return Maximum Dot Product
return dp[n][m];
}
// Driver code
public static void main(String[] args) {
int A[] = {2, 3, 1, 7, 8};
int B[] = {3, 6, 7};
int m = A.length;
int n = B.length;
System.out.print(MaxDotProduct(A, B, m, n));
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python 3 program to find maximum dot
# product of two array
# Function compute Maximum Dot Product
# and return it
def MaxDotProduct(A, B, m, n):
# Create 2D Matrix that stores dot product
# dp[i+1][j+1] stores product considering
# B[0..i] and A[0...j]. Note that since
# all m > n, we fill values in upper
# diagonal of dp[][]
dp = [[0 for i in range(m + 1)]
for j in range(n + 1)]
# Traverse through all elements of B[]
for i in range(1, n + 1, 1):
# Consider all values of A[] with indexes
# greater than or equal to i and compute
# dp[i][j]
for j in range(i, m + 1, 1):
# Two cases arise
# 1) Include A[j]
# 2) Exclude A[j] (insert 0 in B[])
dp[i][j] = max((dp[i - 1][j - 1] +
(A[j - 1] * B[i - 1])) ,
dp[i][j - 1])
# return Maximum Dot Product
return dp[n][m]
# Driver Code
if __name__ == '__main__':
A = [2, 3 , 1, 7, 8]
B = [3, 6, 7]
m = len(A)
n = len(B)
print(MaxDotProduct(A, B, m, n))
# This code is contributed by
# Sanjit_Prasad
C#
// C# program to find maximum
// dot product of two array
using System;
public class GFG{
// Function to compute Maximum
// Dot Product and return it
static int MaxDotProduct(int []A, int []B, int m, int n)
{
// Create 2D Matrix that stores dot product
// dp[i+1][j+1] stores product considering B[0..i]
// and A[0...j]. Note that since all m > n, we fill
// values in upper diagonal of dp[][]
int [,]dp = new int[n + 1,m + 1];
// Traverse through all elements of B[]
for (int i = 1; i <= n; i++)
// Consider all values of A[] with indexes greater
// than or equal to i and compute dp[i][j]
for (int j = i; j <= m; j++)
// Two cases arise
// 1) Include A[j]
// 2) Exclude A[j] (insert 0 in B[])
dp[i,j] =
Math.Max((dp[i - 1,j - 1] +
(A[j - 1] * B[i - 1])), dp[i,j - 1]);
// return Maximum Dot Product
return dp[n,m];
}
// Driver code
public static void Main() {
int []A = {2, 3, 1, 7, 8};
int []B = {3, 6, 7};
int m = A.Length;
int n = B.Length;
Console.Write(MaxDotProduct(A, B, m, n));
}
}
/*This code is contributed by 29AjayKumar*/
Javascript
输出:
107
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。