Finding maximum size sub-matrix of all 1's in a matrix having 1's and 0's

前端 未结 4 1012
栀梦
栀梦 2020-12-04 13:42

Suppose you are given an mXn bitmap, represented by an array M[1..m,1.. n] whose entries are all 0 or 1. A all-one block is a subarray of the form M[i .. i0, j .. j0] in whi

4条回答
  •  感动是毒
    2020-12-04 14:11

    Here is a O(N) implementation in C#.

    The idea is to use a dynamic programming to build an accumulated Matrix that has the size of the biggest submatrix including the current cell itself.

        public static int LargestSquareMatrixOfOne(int[,] original_mat)
        {
            int[,] AccumulatedMatrix = new int[original_mat.GetLength(0), original_mat.GetLength(1)];
            AccumulatedMatrix[0, 0] = original_mat[0, 0];
            int biggestSize = 1;
            for (int i = 0; i < original_mat.GetLength(0); i++)
            {
                for (int j = 0; j < original_mat.GetLength(1); j++)
                {
                    if (i > 0 && j > 0)
                    {
                        if (original_mat[i, j] == 1)
                        {
                            AccumulatedMatrix[i, j] = Math.Min(AccumulatedMatrix[i - 1, j - 1], (Math.Min(AccumulatedMatrix[i - 1, j], AccumulatedMatrix[i, j - 1]))) + 1;
                            if (AccumulatedMatrix[i, j] > biggestSize)
                            {
                                biggestSize = AccumulatedMatrix[i, j];
                            }
                        }
                        else
                        {
                            AccumulatedMatrix[i, j] = 0;
                        }
                    }
                    else if ( (i > 0 && j == 0) || (j > 0 && i == 0))
                    {
                        if (original_mat[i, j] == 1) { AccumulatedMatrix[i, j] = 1; }
                        else { AccumulatedMatrix[i, j] = 0; }
                    }
                }
            }
            return biggestSize;
        }
    

提交回复
热议问题