题面
题意
在一个01矩阵中找出最大的全为0的子矩阵。
方法
首先预处理出每一个点从左到右连续0的个数,然后一列一列比较,找出以每一列为子矩形最后一列的最优结果(每一列的处理方法详见Histogram LightOJ - 1083),之后不断更新答案即可。
关键在于将此二维问题转化为一维的。
代码
#include<bits/stdc++.h>
#define N 2010
using namespace std;
char ch;
int m,n,T,TT,num[N][N],le[N],ri[N];
int main()
{
int i,j;
cin>>T;
TT=T;
while(T--)
{
int ans;
ans=0;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
{
ch=getchar();
for(j=1;j<=n;j++)
{
ch=getchar();
if(ch=='0') num[i][j]=num[i][j-1]+1;
else num[i][j]=0;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
le[j]=j;
while(le[j]>1&&num[j][i]<=num[le[j]-1][i])
{
le[j]=le[le[j]-1];
}
}
for(j=m;j>=1;j--)
{
ri[j]=j;
while(ri[j]<m&&num[j][i]<=num[ri[j]+1][i])
{
ri[j]=ri[ri[j]+1];
}
}
for(j=1;j<=m;j++)
{
ans=max(ans,(ri[j]-le[j]+1)*num[j][i]);
}
}
printf("Case %d: %d\n",TT-T,ans);
}
}