-
题目描述:
-
在一个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
package lee1;
import java.util.*;
public class Main {
static int max(int x, int y) {
return (x > y)?x:y;
}
public static void main(String[] args) {
int m, n;
int[][] a, b;
int[] m_b;
int i, j, k;
int t;
int mm;
Scanner cin = new Scanner(System.in);
while(cin.hasNext()) {
m = cin.nextInt();
n = cin.nextInt();
a = new int[m][n];
b = new int[m][n];
m_b = new int[n];
mm = 0;
//m_b = 0;
for(i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
a[i][j] = cin.nextInt();
if (a[i][j] == 0) {
b[i][j] = 0;
}
else {
b[i][j] = 1;
if (j > 0 && b[i][j-1] > 0) {
b[i][j] += b[i][j-1];
}
}
//System.out.print(b[i][j] + " ");
}
//System.out.println();
}
for (j = 0; j < n; j++) {
m_b[j] = 0;
for(i = 0; i < m; i++) {
if (b[i][j] == 0) {
continue;
}
t = 0;
if (i == 0) {
for (k = i; k < m; k++) {
if (b[i][j] <= b[k][j]) {
t += b[i][j];
}
}
}
else if (i == m - 1) {
for (k = i; k >= 0; k--) {
if (b[i][j] <= b[k][j]) {
t += b[i][j];
}
}
}
else {
for (k = i; k < m; k++) {
if (b[i][j] <= b[k][j]) {
t += b[i][j];
}
}
for (k = i; k >= 0; k--) {
if (b[i][j] <= b[k][j]) {
t += b[i][j];
}
}
t -= b[i][j];
//System.out.println(m_b[j]);
}
if (t > m_b[j]) {
m_b[j] = t;
}
}
if(m_b[j] > mm) {
mm = m_b[j];
}
}
System.out.println(mm);
}
}
}