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

동적 프로그래밍을 사용하여 최적의 괄호를 수행하는 C++ 프로그램

<시간/>

Dynamic Programming을 사용하여 Optimal Paranthesization을 수행하는 C++ 프로그램입니다.

알고리즘

Begin
   Take the length n and dimension of matrix as input.
   MatrixChain() to find out minimum multiplications:
   Arguments:
      a[i][j]=Minimum number of scalar multiplications needed to
         compute the matrix A[i]A[i+1]...A[j] = A[i..j] where dimension of A[i] is p[i-1] x p[i].
         a[i][j] means cost is zero when multiplying one matrix.
      L is chain length.
      m = cost / scalar multiplications.
   Body of the function:
      for i = 1 to n-1
         Initialize a[i][i] = 0
      for L = 2 to n-1
         for i = 1 to n - L + 1
            j = i + L - 1
            a[i][j] = INT_MAX
            for k = i to j - 1
               m = a[i][k] + a[k + 1][j] + p[i - 1] * p[k] * p[j];
               if (m < a[i][j])
               a[i][j] = m
               b[i][j] = k
   return a[1][n - 1]
End

예시

#include<limits.h>
#include<iostream>
using namespace std;
int MatrixChain(int p[], int n) {
   int a[n][n];
   int b[n][n];
   int i, j, k, L, m;
   for (i = 1; i < n; i++)
      a[i][i] = 0;
   for (L = 2; L < n; L++) {
      for (i = 1; i <= n - L + 1; i++) {
         j = i + L - 1;
         a[i][j] = INT_MAX;
         for (k = i; k <= j - 1; k++) {
            m = a[i][k] + a[k + 1][j] + p[i - 1] * p[k] * p[j];
            if (m < a[i][j]) {
               a[i][j] = m;
               b[i][j] = k;
            }
         }
      }
   }
   return a[1][n - 1];
}
int main() {
   cout << "Enter the length:";
   int n;
   cin >> n;
   int a[n];
   cout << "Enter the dimensions: ";
   for (int v = 0; v < n; ++v) {
      cin >> a[v];
   }
   cout << "Minimum number of multiplications is: " <<
   MatrixChain(a,n);
   return 0;
}

출력

Enter the length:5
Enter the dimensions: 2 3 7 6 4
Minimum number of multiplications is: 174