最大全1矩阵元素数

来源:互联网 发布:2017软件退税政策 编辑:程序博客网 时间:2024/05/01 05:17
题目描述:

在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。

输出:

对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。

样例输入:
2 20 00 04 40 0 0 00 1 1 00 1 1 00 0 0 0
样例输出:
04

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);}}}