soj 3329 Maximum Submatrix II【转帖】

题目描述:

Have you ever watched the movie Matrix ? 
In that movie, 
the term Matrix does not mean a mathematical thing, 
but a complicated AI system. 

In this problem, 
we will go back to the original meaning of matrix. 
Given a 0-1 matrix, 
you are required to find the maximum submatrix in it 
which contains only 0s.

Input



The first line of input is the number of test case.
For each test case:
The first line contains two integers N and M.
The next N lines each contains M integers, Aij.
There is a blank line before each test case.

1 <= N,M <= 1000
0 <= Aij <= 1

Output



For each test case output the answer on a single line.

Sample Input



2

2 2
0 0
0 0

4 5
1 0 1 0 0
0 1 0 0 0
0 0 1 0 0
1 1 0 0 0

Sample Output



4
8

Source



8th SCUPC

Author



This problem is in memory of SOJ2096--Maximum Submatrix.

#include<stdio.h> #define N 1005 int a[N][N],b[N],left[N],right[N]; int main() { int i,j,n,m,k,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); b[j]=0; } } int max=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i][j]==0) b[j]++; else b[j]=0; left[j]=right[j]=j; } left[1]=0; right[m]=m+1; for(j=2;j<=m;j++) { k=j-1; while(k>0) { if(b[j]<=b[k]) k=left[k]; else break; } left[j]=k; } for(j=m-1;j>=1;j--) { k=j+1; while(k<=m) { if(b[j]<=b[k]) k=right[k]; else break; } right[j]=k; } for(j=1;j<=m;j++) { if(b[j]*(right[j]-left[j]-1)>max) max=b[j]*(right[j]-left[j]-1); } } printf("%d/n",max); } return 0; } 

你可能感兴趣的:(soj 3329 Maximum Submatrix II【转帖】)