描述
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.
输入
The input contains multiple test cases. Each test case begins with m and n (1 ≤ m, n ≤ 2000) on line. Then come the elements of a (0,1)-matrix in row-major order on m lines each with n numbers. The input ends once EOF is met.
输出
For each test case, output one line containing the number of elements of the largest submatrix of all 1’s. If the given matrix is of all 0’s, output 0.
样例输入
2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
样例输出
0
4
题意是在给出的矩阵中,找一个最大的其中元素全为1的子矩阵,输出其大小。
矩阵的大小可以用长乘宽来表示,对各个矩阵高度长度都不一样,不方便进行比较,所以以行为基准,对同一行的不同高度的矩阵进行比较,最后得到这些矩阵的大小最大值。
一列的长度为1,可以化作求对同水平线上宽度为1不同高度的矩形中能得到的最大矩形,这里就用到单调栈。
对每一行用单调栈进行处理,栈内存储的是下标。
令当前访问到第i行第j个元素,h[j]表示以i行j列的高度,f[i]表示以h[j]为高的矩形的最大值,把高度存进栈内,只要栈顶的高度大于h[j]就可以划出高为h[j]宽为j - st[top]的矩形,比当前高的高度就出栈,保证栈单调,继续往前找直至出现一个小于h[j]的高度,在st[top]之后的高度都是可以的,所以可以用h[st[top]] * (j - st[top - 1] - 1)表示以j为最右端h[j]为高的最大矩形大小。
对每一行进行相同的处理,ans记录所有得到的矩形里最大的值,即为答案。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 2010;
int MOD;
LL n, m;
int a[N][N], col[N], st[N];//col表示上述h
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
while(cin >> n >> m) {
memset(col, 0, sizeof col);
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= m;j ++)
cin >> a[i][j];
col[0] = col[m + 1] = -1;
int ans = 0;
for(int i = 1;i <= n;i ++){
int tt = 0;
for(int j = 1;j <= m;j ++)
if(a[i][j]) col[j] ++;
else col[j] = 0;
for(int j = 0;j <= m + 1;j ++) {
while(tt && col[st[tt]] > col[j]) {
ans = max(ans, col[st[tt]] * (j - st[tt] - 1));
tt --;
}
st[++ tt] = j;
}
}
cout << ans << '\n';
}
return 0;
}