you are given a M x N matrix with 0's and 1's find the matrix-
1. find the largest square matrix with all elements 1's
2. Find the largest rectangular matrix with all elements 1's
Its simple DP problem guys ..just think of extending the solution to sub-problem.
Will post answer soon..till then give it a try.
Okie so recursive expression is
SQ(i,j) = MIN(SQ(i-1,j),SQ(i-1,j-1),SQ(i,j-1))*ARR(i,j)+ARR(i,j);
Idea is that SQ(i,j) will be a 1+ min of its precedents square size.
I am multiplying and adding to avoid if else condition
if ( ARR[i][j] == 1 )
SQ(i,j) = MIN(SQ(i-1,j),SQ(i-1,j-1),SQ(i,j-1))+1;
else
SQ(i,j) = 0;
is same as this SQ(i,j) = MIN(SQ(i-1,j),SQ(i-1,j-1),SQ(i,j-1))*ARR(i,j)+ARR(i,j);
Will post code soon.
1. find the largest square matrix with all elements 1's
2. Find the largest rectangular matrix with all elements 1's
Its simple DP problem guys ..just think of extending the solution to sub-problem.
Will post answer soon..till then give it a try.
Okie so recursive expression is
SQ(i,j) = MIN(SQ(i-1,j),SQ(i-1,j-1),SQ(i,j-1))*ARR(i,j)+ARR(i,j);
Idea is that SQ(i,j) will be a 1+ min of its precedents square size.
I am multiplying and adding to avoid if else condition
if ( ARR[i][j] == 1 )
SQ(i,j) = MIN(SQ(i-1,j),SQ(i-1,j-1),SQ(i,j-1))+1;
else
SQ(i,j) = 0;
is same as this SQ(i,j) = MIN(SQ(i-1,j),SQ(i-1,j-1),SQ(i,j-1))*ARR(i,j)+ARR(i,j);
Will post code soon.
Source code:
ReplyDelete#include
using namespace std;
int const size = 6;
int min( int a, int b, int c )
{
cout <<(a<b?(a<c?a:c):(b<c?b:c))<<endl;
return (a<b?(a<c?a:c):(b<c?b:c));
}
int main()
{
int arr[size][size] = {
{ 0, 0 , 0 , 0, 1, 0 },
{ 0, 1 , 1 , 1, 0, 1 },
{ 0, 1 , 1 , 0, 0, 0 },
{ 1, 0 , 1 , 1, 1, 1 },
{ 0, 0 , 1 , 1, 1, 0 },
{ 0, 1 , 1 , 1, 1, 1 }};
int result[size+1][size+1];
int i, j;
for ( i = 0; i < size;i++)
{
result[i][0] = 0;
result[0][i] = 0;
}
for ( i = 1; i < size+1;i++)
{
for ( j = 1; j < size+1;j++)
{
if ( arr[i-1][j-1] == 0 )
result[i][j] = 0;
else
result[i][j] = min(result[i-1][j],result[i-1][j-1],result[i][j-1])+1;
}
}
for ( i = 0; i < size+1;i++)
{
for ( j = 0; j < size+1;j++)
{
cout<<result[i][j]<<" ";
}
cout<<endl;
}
return 0;
}