118.最大全0子矩阵
题目描述 Description
在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。
输入描述 Input
Description
输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开。
输出描述 Output
Description
输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数。
样例输入 Sample
Input
5
0 1 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0
样例输出 Sample
Output
9
数据范围及提示 Data Size &
Hint
分类标签 Tags 点此展开
代码:
#include<
ostream >
#include<
cstdio >
using namespace
std;
#define INF
2001
int
f[INF][INF],n,h[INF],l[INF],r[INF];
void
input()
{
scanf("%d",&n);
for(int
i=1;i<=n;++i)
int
ma=0;//储存最大值
for(int
i=1;i<=n;++i)
{
for(int
j=1;j<=n;++j)
{
if(!f[i][j])
h[j]++;//h[]是滚动数组,记录第i行第j列的最大高度
else
h[j]=0;//如果不是0,那么高度就是0
}
for(int
j=1;j<=n;++j)
{
l[j]=j;
while(l[j]>1&&h[j]<=h[l[j]-1])
l[j]=l[l[j]-1];
}
for(int
j=n;j>=1;--j)
{
r[j]=j;
while(r[j]<=h[r[j]+1])
r[j]=r[r[j]+1];
}
for(int
j=1;j<=n;++j)//记录这一行的最大值
if(ma
ma=h[j]*(r[j]-l[j]+1);
}
printf("%d\n",ma);
}
int main()
{
input();
return 0;
}