面积最大的全1子矩阵

面积最大的全1矩阵

题目描写叙述:

在一个M * N的矩阵中,全部的元素仅仅有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。

输入:

输入可能包括多个測试例子。
对于每一个測试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。


矩阵共同拥有m行,每行有n个整数,各自是0或1。相邻两数之间严格用一个空格隔开。

输出:

相应每一个測试案例,输出矩阵中面积最大的全1子矩阵的元素个数。

例子输入:
2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
例子输出:
0
4
解题思路:
      从第一行開始。一行一行向下扫描。记录每一列当前的1的个数(碰到0时候清零,能够理解为高度,记录其为h[i ]),然后计算每一列的符合该列高度的矩形有多宽(对第j列而言。宽度为r[j]-l[j]+1)最后遍历全然部行得到的最大面积就是答案。


AC代码:
#include<cstdio>
#include<cstring>

using namespace std;

int matrix[1005][1005];
int h[1005];
int r[1005];
int l[1005];

int main(int argc,char *argv[])
{
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i,j,k;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				scanf("%d",&matrix[i][j]);
			}
		}
		memset(h,0,sizeof(h));
		int ans=0;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				if(matrix[i][j]==1)
					h[j]++;
				else
					h[j]=0;
			}
			h[0]=h[m+1]=-1;
			for(j=1;j<=m;j++)//l[i]表示h[i]左边最远的一个h值不小于h[i]的位置
			{             //即l[i]到i的全部h值均>=h[i],r[i]同理
				k=j;
				while(h[j]<=h[k-1])
					k=l[k-1];
				l[j]=k;
			}
			for(j=m;j>=1;j--)//r[i]表示h[i]右边最远的一个h值不小于h[i]的位置
			{
				k=j;
				while(h[j]<=h[k+1])
					k=r[k+1];
				r[j]=k;
			}
			for(j=1;j<=m;j++)
			{
				if(ans<h[j]*(r[j]-l[j]+1))
					ans=h[j]*(r[j]-l[j]+1);
			}
		}
		printf("%d\n",ans);
	}

	return 0;
}

posted @ 2016-02-02 13:00  zfyouxi  阅读(511)  评论(0编辑  收藏  举报