C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++での行列の連鎖乗積(A O(N ^ 3)ソリューション)


行列のチェーンが与えられた場合、乗算する行列の正しいシーケンスの最小数を見つける必要があります。

行列の乗算は結合法則であることがわかっているため、4つの行列ABCDを使用すると、これらのシーケンスでA(BCD)、(AB)(CD)、(ABC)D、A(BC)Dを乗算できます。これらのシーケンスと同様に、私たちのタスクは、乗算するのに効率的な順序を見つけることです。

指定された入力には、arr [] ={1、2、3、4}を含む配列sayarrがあります。これは、行列が(1 x 2)、(2 x 3)、(3 x 4)の順序であることを意味します。

入力 −入力行列の次数。 {1、2、3、4}。行列が

であることを意味します
{(1 x 2), (2 x 3), (3 x 4)}.

出力 −最小数の演算では、これら3つの行列を乗算する必要があります。ここで結果は18です。

アルゴリズム

matOrder(array, n)
Input: List of matrices, the number of matrices in the list.
Output: Minimum number of matrix multiplication.
Begin
   define table minMul of size n x n, initially fill with all 0s
   for length := 2 to n, do
      for i:=1 to n-length, do
         j := i + length – 1
         minMul[i, j] := ∞
         for k := i to j-1, do
            q := minMul[i, k] + minMul[k+1, j] + array[i-1]*array[k]*array[j]
            if q < minMul[i, j], then
               minMul[i, j] := q
            done
         done
      done
   return minMul[1, n-1]
End
を返します

#include<iostream>
using namespace std;
int matOrder(int array[], int n){
   int minMul[n][n]; //holds the number of scalar multiplication needed
   for (int i=1; i<n; i++)
      minMul[i][i] = 0; //for multiplication with 1 matrix, cost is 0
      for (int length=2; length<n; length++){ //find the chain length starting from 2
         for (int i=1; i<n-length+1; i++){
            int j = i+length-1;
            minMul[i][j] = INT_MAX; //set to infinity
            for (int k=i; k<=j-1; k++){
               //store cost per multiplications
               int q = minMul[i][k] + minMul[k+1][j] + array[i-1]*array[k]*array[j];
               if (q < minMul[i][j])
                  minMul[i][j] = q;
            }
      }
   }
   return minMul[1][n-1];
}
int main(){
   int arr[] = {1, 2, 3, 4};
   int size = 4;
   cout << "Minimum number of matrix multiplications: "<<matOrder(arr, size);
}

出力

Minimum number of matrix multiplications: 18

  1. C ++でのMatrixのジグザグ(または対角)トラバーサル

    この問題では、2D行列が与えられます。私たちの仕事は、マトリックのすべての要素を対角線の順序で印刷することです。 問題を理解するために例を見てみましょう 1    2    3 4    5    6 7    8    9 出力- 1 4    2 7    5    3 8    6 9 マトリックスをジグザグ形式または対角形式で印刷するときに従うパターンを見てみましょう。 こ

  2. C++のスパイラルマトリックスIII

    R行とC列の2次元グリッドがあるとすると、東向きの(r0、c0)から開始します。ここで、グリッドの北西の角は最初の行と列にあり、グリッドの南東の角は最後の行と列にあります。このグリッドのすべての位置を訪問するために、時計回りのスパイラル形状で歩きます。グリッドの境界の外側にいるときは、グリッドの外側を歩き続けます(ただし、後でグリッドの境界に戻る場合があります)。グリッドの位置を表す座標のリストを、訪問した順序で見つける必要があります。したがって、グリッドが-のような場合 次に、矢印がパスになります。 これを解決するには、次の手順に従います- dirrを作成:=[[0,1]、[