【POJ】3494 Largest Submatrix of All 1’s

【POJ】3494 Largest Submatrix of All 1’s

Time Limit: 5000MS
Memory Limit: 131072K
Case Time Limit: 2000MS

Description

Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest we mean that the submatrix has the most elements.

Input

The input contains multiple test cases. Each test case begins with m and n (1 ≤ m, n ≤ 2000) on line. Then come the elements of a (0,1)-matrix in row-major order on m lines each with n numbers. The input ends once EOF is met.

Output

For each test case, output one line containing the number of elements of the largest submatrix of all 1’s. If the given matrix is of all 0’s, output 0.

Sample Input

2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0

Sample Output

0
4

translation

The largest submatrix of all 1s

Time limit: 5000MS
Memory limit: 131072K
Case time limit: 2000MS

description

Given an m × n(0,1) matrix, which of all sub-matrices of 1 is the largest? By largest, we mean that the sub-matrix has the most elements.

enter

The input contains multiple test cases. Each test case starts with meters and Ñ (1≤meter, Ñupline ≤2000). Then the (0,1)-matrix elements appear on m rows with n numbers in each row in row-major order. Once EOF is met, the input ends.

Output

For each test case, output a row containing the number of elements of the largest sub-matrix of all ones. If the given matrix is ​​all 0, then output 0.

Sample input

2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0

Sample output

0
4

Ideas

The title is an upgraded version of POJ2559 .
Calculate the number of consecutive 1s in the current column from bottom to top for each layer, do the maximum area once, and compare the maximum value.

Code

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
long long a[100010]; 
struct jgt
{
    
    
	long long wide,high;//宽,高。 
}; 
stack<jgt> s,k;
int main()
{
    
    
	long long n,m,i,j,ans,w,t,sum;
	jgt tem;
	while(cin>>n>>m)
	{
    
    
		memset(a,0,sizeof(a));
		for(s=k,a[m+1]=-1,ans=0,i=1;i<=n;i++)
		{
    
    
			for(j=1;j<=m;j++) 
			{
    
    
				scanf("%lld",&t);
				if(t) a[j]++;
				else a[j]=0;
			}
			for(j=1;j<=m+1;j++)
			{
    
    
				for(w=0;!s.empty()&&a[j]<=s.top().high;s.pop())//删除大于当前数的数
				{
    
    
				    w+=s.top().wide;//宽度增加 
				    ans=max(w*s.top().high,ans);//求最大面积 
				}
				tem.high=a[j],tem.wide=w+1;
				s.push(tem);
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_46975572/article/details/114639960