118.最大全0子矩阵

1159 最大全0子矩阵

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 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)
  for(int j=1;j<=n;++j)
  {
   scanf("%d",&f[i][j]);//f数组存矩阵 
  }
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;
}

posted @ 2016-04-03 16:27  csgc0131123  阅读(401)  评论(0编辑  收藏  举报