Maximum size Square sub-with all 1’s in C++

In this tutorial, we are going to discuss how to find maximum square sub-matrix with all 1’s and its size in a given binary matrix in C++. We will use a dynamic programming approach to solve this problem.

What is Dynamic Programming?

Dynamic programming is an approach to solve the complex problem by breaking down into simple sub-problems and store the result of sub-problems for future use. We use DP basically when we have to use a recursive approach for a problem and there is a need to calculate the result of the same sub-problem again and again.



Step by Step Approach

  • Take two input n and m as rows and columns of input matrix.
  • Input 2-D binary matrix a[][] of size n*m.
  • Take an auxiliary 2-D matrix b[][] of size n*m.
  • Now, input elements of 1st row and 1st column of a[][] as it is in matrix b[][].
  • Now, fill rest of matrix b[][] as

find maximum square sub-matrix with all 1’s in C++

check every possible square 2*2 matrix and find minimum element among top-left, top-right, bottom-left element and find fill bottom-right element as min. among 3 + 1 else fill the value 0.

Code Snippet:-

if(a[i][j] == 1)
b[i][j] = min(b[i][j-1],min(b[i-1][j], b[i-1][j-1])) + 1;
else
b[i][j] = 0;

  • Check for maximum value in matrix b[][] and store it in max_num and that row value in max_i and column in max_j.
  • To print the max square sub-matrix of 1’s backtrack from max_i,max_j and print matrix of max_num*max_num.

 

C++ Code implementation of maximum square sub-matrix with 1’s

#include<bits/stdc++.h> 

 using namespace std;
 
  int a[100][100];

  void solve(long long n, long long m) 
{ 
  int i,j; 
  int b[100][100]; 

  for(i = 0; i < n; i++) 
  b[i][0] = a[i][0]; 


  for(j = 0; j < m; j++) 
   b[0][j] = a[0][j]; 
  

    for(i = 1; i < n; i++) 
  { 
    for(j = 1; j < m; j++) 
  { 
       if(a[i][j] == 1) 
    b[i][j] = min(b[i][j-1],min(b[i-1][j], b[i-1][j-1])) + 1; 

    else
    b[i][j] = 0; 
  } 
} 


  int max_num = b[0][0], max_i = 0, max_j = 0; 

   for(i = 0; i < n; i++) 
  { 
   for(j = 0; j < m; j++) 
 	{ 
      if(max_num < b[i][j]) 
    { 
      	max_num = b[i][j]; 
        max_i = i; 
        max_j = j; 
      }	 
  }				 
}	 


   cout<<"Maximum size of Sub-matrix with 1's is : "<<max_num<<"*"<<max_num<<endl;
   
   cout<<"\n Max Square sub-matrix with 1's is :"<<endl;

   for(i = max_i; i > max_i - max_num; i--) 
 { 
    	for(j = max_j; j > max_j - max_num; j--) 
  { 
       cout<<a[i][j]; 
  } 
    cout<<endl; 
  } 
}	 



  int main() 
{ 
   long long i,j,n,m;
   
        cin>>n>>m;
   
          for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
               cin>>a[i][j];
        }
        
         solve(n,m);
}

INPUT

8 8
1 1 0 0 1 1 0 1
1 1 1 0 0 0 0 0
1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
0 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1

OUTPUT

Maximum size of Sub-matrix with 1's is : 4*4

Max Square sub-matrix with 1's is :
1111
1111
1111
1111

You may also read these,

Leave a Reply

Your email address will not be published. Required fields are marked *