题目大意
给出一个只有0和1的 n ∗ m n*m n∗m矩阵,求出面积最大的只含有1的子矩阵。
原题&样例
分析
这题就是例题2的升级版,把一维变成二维了。
这题用了压行的思想,把多行压成一行。我们可以按列求高度,将每个点的高度赋值到数组里
接下来,我们用两个循环来做,一个枚举行,一个枚举列,在两者之间做单调栈,弹出时记录一下它能到达最左边和最右边的编号,在求面积时和当前高度相乘更新答案。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,a[2010][2010],b[2010],q[2010],ans,top;
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(b,0,sizeof(b));
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
b[0]=b[m+1]=-1;
ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==1) b[j]+=1;
else b[j]=0;
}
memset(q,0,sizeof(q));
top=0;
for(int j=0;j<=m+1;j++)
{
while(b[q[top]]>b[j]&&top>0)
{
int tmp=b[q[top]];
top--;
ans=max(ans,tmp*(j-q[top]-1));
}
top++;
q[top]=j;
}
}
cout<<ans<<endl;
}
return 0;
}