題目描述: 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. InputThe 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 OutputFor each test case output the answer on a single line. Sample Input2 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 Output4 8 Source8th SCUPC AuthorThis problem is in memory of SOJ2096--Maximum Submatrix. #include<stdio.h><br />#define N 1005<br />int a[N][N],b[N],left[N],right[N];<br />int main()<br />{<br /> int i,j,n,m,k,t;<br /> scanf("%d",&t);<br /> while(t--)<br /> {<br /> scanf("%d%d",&n,&m);<br /> for(i=1;i<=n;i++)<br /> {<br /> for(j=1;j<=m;j++)<br /> {<br /> scanf("%d",&a[i][j]);<br /> b[j]=0;<br /> }<br /> }<br /> int max=0;<br /> for(i=1;i<=n;i++)<br /> {<br /> for(j=1;j<=m;j++)<br /> {<br /> if(a[i][j]==0)<br /> b[j]++;<br /> else<br /> b[j]=0;<br /> left[j]=right[j]=j;<br /> }<br /> left[1]=0;<br /> right[m]=m+1;<br /> for(j=2;j<=m;j++)<br /> {<br /> k=j-1;<br /> while(k>0)<br /> {<br /> if(b[j]<=b[k])<br /> k=left[k];<br /> else<br /> break;<br /> }<br /> left[j]=k;<br /> }<br /> for(j=m-1;j>=1;j--)<br /> {<br /> k=j+1;<br /> while(k<=m)<br /> {<br /> if(b[j]<=b[k])<br /> k=right[k];<br /> else<br /> break;<br /> }<br /> right[j]=k;<br /> }<br /> for(j=1;j<=m;j++)<br /> {<br /> if(b[j]*(right[j]-left[j]-1)>max)<br /> max=b[j]*(right[j]-left[j]-1);<br /> }<br /> }<br /> printf("%d/n",max);<br /> }<br /> return 0;<br />} |