题意:
问矩阵中最大的全1矩阵的面积
思路:
预处理出每个1位置向上的最大高度,然后遍历每个点,用单调栈维护出这个点的高度在这一行中最多可以到达的最左最右点,然后计算面积取最大值
#include <iostream>
#include <stack>
#include <cstdio>
using namespace std;
#define ll long long
int n,m;
int mp[2010][2010];
int pre[2010][2010];
int l[2010],r[2010];
stack<int>s;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==0)
pre[i][j]=0;
else
pre[i][j]=pre[i-1][j]+1;
}
}
int maxx=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
while(!s.empty()&&pre[i][j]<=pre[i][s.top()])
s.pop();
l[j]=s.size()==0?1:s.top()+1;
s.push(j);
}
while(!s.empty())
s.pop();
for(int j=m;j>=1;j--)
{
while(!s.empty()&&pre[i][j]<=pre[i][s.top()])
s.pop();
r[j]=s.size()==0?m:s.top()-1;
s.push(j);
}
while(!s.empty())
s.pop();
for(int j=1;j<=m;j++)
{
int now=pre[i][j]*(r[j]-l[j]+1);
if(now>maxx)
maxx=now;
}
}
printf("%d\n",maxx);
}
}