Leetcode 85 - Maximal Rectangle
POJ地址:http://poj.org/problem?id=3494
例如:图中是一个4 × 6的矩形,画出红色的是我们要找到的区域。
POJ地址:http://poj.org/problem?id=3494
Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest we mean that the submatrix has the most elements.
题目简述
题目的描述很简单,在一个M * N的矩阵中,所有的元素只有0和1, 找出只包含1的最大矩形。例如:图中是一个4 × 6的矩形,画出红色的是我们要找到的区域。
这样的话,其实我们要找到的某个矩形就转换成 一某一个行开始的 histogram的最大矩形问题了。
那么我们原始矩形可以变成如下的形式的数据:
第一行表示,我们以第一行作为底边,所形成的 histogram的高度,其他行也类似。
所以问题变成了 枚举每一行,然后求出每一行对应的histogram的最大矩形。
关于histogram求最大矩形
- int nRow, nCol;
- int matrix[MAX_LEN][MAX_LEN]; //原数据
- int heights[MAX_LEN][MAX_LEN];//用这个数组来描述 histogram,其中heights[i]表示 以第i行走底的histogram,里面的元素表示对应列的高度
- struct Node
- {
- int height;
- int position;
- Node(int _height, int _from): height(_height), position(_from)
- { }
- Node()
- { }
- };
- int max(int a, int b)
- {
- return a>b ? a : b;
- }
- int GetArea(int iRow) //用单调栈来枚举其中以 某一行做底的 histogram 所得到的最大矩形面积。
- {
- topID = 0;
- push(Node(-1, 0));
- int i;
- int area, maxArea = 0;
- int position, height;
- for( i = 0; i <= nCol; i++)
- {
- position = i + 1;
- if(i == nCol)
- {
- height = -1;
- }
- else
- {
- height = heights[iRow][i];
- }
- Node t(height, position);
- while(top().height > height)
- {
- t = top();
- pop();
- area = (position - t.position) * t.height;
- if(area > maxArea)
- {
- maxArea = area;
- }
- }
- push(Node(height, t.position));
- }
- return maxArea;
- }
- int main()
- {
- while(scanf("%d%d", &nRow, &nCol) != EOF)
- {
- int i,j;
- int b;
- for( i = 0;i < nRow; i++)
- {
- for( j = 0; j < nCol; j++)
- {
- scanf("%d", &matrix[i][j]);
- }
- }
- //求histogram,求的时候,如果以 i 行为底边,j对应的高度是 从i 到 最高连续的1 的数量
- memcpy(heights, matrix, sizeof(matrix));
- for( i = 0; i < nCol; i++)
- {
- for( j = 1; j < nRow; j++)
- {
- if(heights[j][i] != 0)
- {
- heights[j][i] += heights[j-1][i];
- }
- }
- }
- int maxArea = 0, Area;
- for( i = 0; i < nRow; i++)
- {
- Area = GetArea(i);
- maxArea = max(maxArea, Area);
- }
- printf("%d\n", maxArea);
- }
- }