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

C++プログラムでカウントが0よりも1多い最大サブマトリックス領域


この問題では、バイナリ数(0/1)で構成されるサイズnXnの2次元行列が与えられます。私たちのタスクは、カウントが0よりも1多い最大サブマトリックス領域を見つけるプログラムを作成することです。

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

入力

bin[N][N] = {
   {0, 1, 0, 0},
   {1, 1, 0, 0},
   {1, 0, 1, 1},
   {0, 1, 0, 1}
}

出力

9

説明

submatrix :
bin[1][0], bin[1][1], bin[1][2]
bin[2][0], bin[2][1], bin[2][2]
bin[3][0], bin[3][1], bin[3][2]
is the largest subarray with more 1’s one more than 0’s.
Number of 0’s = 4
Number of 1’s = 5

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

簡単なアプローチは、行列から可能なすべての部分行列を見つけて、すべての中で最大の面積を返すことです。

このアプローチは、考えて実装するのは簡単ですが、時間がかかり、ループのネストが必要になるため、時間の経過とともに O(n ^ 4)の順序が複雑になります。 。それでは、より効果的なもう1つの方法について説明しましょう。

ここでの考え方は、行列の左右の列を修正してから、1の数よりも0の数が1多い最大のサブ配列を見つけることです。各行で合計を計算し、それを累積します。 1の数が0の数より1多い最大面積を見つけるため。

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

#include <bits/stdc++.h>
using namespace std;
#define SIZE 10
int lenOfLongSubarr(int row[], int n, int& startInd, int& finishInd){
   unordered_map<int, int> subArr;
   int sumVal = 0, maxSubArrLen = 0;
   for (int i = 0; i < n; i++) {
      sumVal += row[i];
      if (sumVal == 1) {
         startInd = 0;
         finishInd = i;
         maxSubArrLen = i + 1;
      }
      else if (subArr.find(sumVal) == subArr.end())
         subArr[sumVal] = i;
      if (subArr.find(sumVal − 1) != subArr.end()) {
         int currLen = (i − subArr[sumVal − 1]);
         if (maxSubArrLen < currLen)
            startInd = subArr[sumVal − 1] + 1;
         finishInd = i;
         maxSubArrLen = currLen;
      }
   }
   return maxSubArrLen;
}
int largestSubmatrix(int bin[SIZE][SIZE], int n){
   int rows[n], maxSubMatArea = 0, currArea, longLen, startInd,
   finishInd;
   for (int left = 0; left < n; left++) {
      memset(rows, 0, sizeof(rows));
      for (int right = left; right < n; right++) {
         for (int i = 0; i < n; ++i){
            if(bin[i][right] == 0)
               rows[i] −= 1;
            else
               rows[i] += 1;
         }
         longLen = lenOfLongSubarr(rows, n, startInd, finishInd);
         currArea = (finishInd − startInd + 1) * (right − left + 1);
         if ((longLen != 0) && (maxSubMatArea < currArea)) {
            maxSubMatArea = currArea;
         }
      }
   }
   return maxSubMatArea;
}
int main(){
   int bin[SIZE][SIZE] = {
      { 1, 0, 0, 1 },
      { 0, 1, 1, 1 },
      { 1, 0, 0, 0 },
      { 0, 1, 0, 1 }
   };
   int n = 4;
   cout<<"The maximum sub−matrix area having count of 1’s one more
   than count of 0’s is "<<largestSubmatrix(bin, n);
   return 0;
}

出力

The maximum sub-matrix area having count of 1’s one more than count of
0’s is 9

  1. C++でのAreaOfSquareのプログラム

    長方形の辺が与えられ、その辺から正方形の領域を印刷することがタスクです。 正方形は、4つの辺を持ち、それぞれ90度の4つの角度を形成し、すべての辺が同じ形状の2D平面図形です。言い換えれば、正方形は辺が等しい長方形の形であると言えます。 以下に示すのは正方形の表現です- 正方形の面積はSidexSide 例 Input: 6 Output: 36 As the side is 6 so the output is 6*6=36 Input: 12 Output: 144 アルゴリズム START    Step 1-> Declare a functio

  2. C++での八面体の表面積のプログラム

    八面体とは何ですか? 「十二面体」という言葉はギリシャ語に由来し、オクタは「8」を意味し、ヘドロンは「顔」を意味します。幾何学的な八面体は、8つの面を持つ3Dプラトニックまたは正多角形です。同様に、他の図の八面体にもプロパティがあり、それは- 6つの多面体頂点 12の多面体エッジ 8つの正三角形 以下は八面体の図です 問題 側面を指定すると、プログラムは八面体の表面積を見つける必要があります。表面積は、指定された図形の面が占める総スペースです。 八面体の表面積を計算するには、次の式があります- ここで、aは八面体の側面です 例 Input-: side=5 Outpu