给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的。输出M2的面积。
Input
第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500)
第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。
Output
输出最大全是1的子矩阵的面积。
Input示例
3 3
1 1 0
1 1 1
0 1 1
Output示例
4
思路:
记录每一个节点的前缀和,然后针对每一列逐行遍历。
#include <iostream>
#include <stack>
using namespace std;
const int MAXN = 550;
int matrix[MAXN][MAXN];
int len[MAXN][MAXN];
int m, n;
int main()
{
cin >> m >> n;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> matrix[i][j];
if (matrix[i][j] == 1)
{
len[i][j] = len[i][j-1] + 1;
}
}
}
int result = 0;
for (int j = 1; j <= n; j++)
{
stack<int> buf;
len[m+1][j] = -1;
for (int i = 1; i <= m+1; i++)
{
int temp = 0;
int top = i;
while (!buf.empty() && len[i][j] < len[buf.top()][j])
{
top = buf.top();
temp = len[top][j] * (i - top);
buf.pop();
result = max(result, temp);
}
if (buf.empty() || len[i][j] > len[buf.top()][j])
{
buf.push(top);
len[top][j] = len[i][j];
}
}
}
cout << result << endl;
return 0;
}