• 面积最大的全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
    ",ans);
    	}
    
    	return 0;
    }
    

  • 相关阅读:
    json页面解析
    map判断
    将页面中所有的checkbox设成单选得
    配置两个环境变量:
    一个input框边输入,另外一个input框中边显示的触发事件
    页面tr和td的的隐藏与显示
    判断声明出来的list为空的时候,list!=null
    从一个表中往另外一个表中插入数据用到的SQL
    final使用方法
    Android学习笔记(23):列表项的容器—AdapterView的子类们
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5177252.html
Copyright © 2020-2023  润新知