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

C++ですべての等しい要素を持つ最大の正方形の部分行列を見つける


この問題では、N*N行列mat[]が与えられます。私たちのタスクは、すべて等しい要素を持つ最大の正方形の部分行列を見つけることです。 。

この問題では、すべての要素が同じである特定の行列から部分行列の最大サイズを見つける必要があります。

問題を理解するために例を見てみましょう

Input: mat[][] = {{1, 2, 1}, {1, 2, 2}, {2, 2, 2}}
Output: 2

説明

matrix a11, a12, a21, a22 is of size 2X2 and forms a sub-matrix with all equal elements.

ソリューションアプローチ

この問題の簡単な解決策は、行列のすべての要素をトラバースしてから、同じ要素を持つすべての部分行列をチェックすることです。アルゴリズムの時間計算量はO(n 3 )および各サブマトリックスは、O(n 2 の時間計算量で作成されます。 。

別の方法 問題を解決するには、動的計画法を使用します。 ここで、サブマトリックスの最大サイズを、その位置までのすべての要素とともに格納します。このために、隣接する要素を検討し、次に、指定された条件を満たす最長の行列を検討します。 DPマトリックスの任意のセルの幅を定式化しましょう。

要素のすべての隣接が同じである場合、最も長い部分行列の値を増やします。この場合、

$ DP [i] [j] \:=\:min(DP [i-1] [j]、DP [i] [j-1]、DP [i-1] [j-1])+ 1 $

そうでない場合は、

DP [i] [j] =1

ソリューションの動作を説明するプログラム

#include<bits/stdc++.h>
#define n 4
#define m 4
using namespace std;
int findmaxSqMatSize(int mat[][m]){
   int DP[n][m];
   memset(DP, sizeof(DP), 0);
   int maxSqMatSize = 0;
   for (int i = 0 ; i < n ; i++){
      for (int j = 0 ; j < m ; j++){
         if (i == 0 || j == 0)
            DP[i][j] = 1;
         else{
            if (mat[i][j] == mat[i-1][j] && mat[i][j] == mat[i][j-1] && mat[i][j] == mat[i-1][j-1] )
               DP[i][j] = min(min(DP[i-1][j], DP[i][j-1]), DP[i-1][j-1] ) + 1;
            else DP[i][j] = 1;
         }
         maxSqMatSize = max(maxSqMatSize, DP[i][j]);
      }
   }
   return maxSqMatSize;
}
int main(){
   int mat[n][m] = { {2, 1, 4, 3},
   {5, 1, 1, 7},
   {1, 1, 1, 4},
   {9, 4, 6, 0}};
   cout<<"The maximum square sub-matrix with all equal elements is "<<findmaxSqMatSize(mat);
   return 0;
}

出力

The maximum square sub-matrix with all equal elements is 2

  1. C++のすべての最も深いノードを持つ最小のサブツリー

    ルートをルートとする二分木があるとすると、各ノードの深さはルートまでの最短距離です。ここで、ノードは、ツリー全体のノードの中で可能な限り最大の深さを持っている場合に最も深くなります。ノードのサブツリーは、そのノードと、そのノードのすべての子孫のセットです。サブツリー内の最も深いノードがすべて含まれるように、最大​​の深さのノードを見つける必要があります。したがって、ツリーが次のような場合- その場合、最も深いサブツリーは-になります これを解決するには、次の手順に従います- ソルブ()と呼ばれるメソッドを定義します。これは入力としてルートになります ルートがnull

  2. C++ですべての配列要素を等しくするために必要な最小限の操作

    問題の説明 n個の正の整数を持つ配列が与えられます。すべての要素を等しくするために、操作の最小数を見つける必要があります。配列要素の任意の要素を使用して、加算、乗算、減算、または除算を実行できます。 例 入力配列が=1、2、3、4}の場合、すべての要素を等しくするには、最低3つの操作が必要です。たとえば、3つの追加を行うことで要素4を作成できます。 アルゴリズム 1. Select element with maximum frequency. Let us call it ‘x’ 2. Now we have to perform n-x operations