Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 0을 삽입하여 두 배열의 최대 내적 찾기

<시간/>

크기가 m과 n인 양의 정수로 구성된 두 개의 배열이 있다고 가정합니다. m> n. 두 번째 배열에 0을 삽입하여 내적을 최대화해야 합니다. 한 가지 명심해야 할 것은 주어진 배열에서 요소의 순서를 변경하지 않는다는 것입니다. 배열이 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

  • 테이블[i, j] :=max(테이블[i - 1, j - 1] + A[j - 1] * B[i - 1], 테이블[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