您的位置:首页 > 编程语言 > Java开发

寻找01矩阵中的最大子矩阵--华为OJ机试--java语言版

2016-09-26 16:21 1281 查看
题目描述:
在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。
输入:
输入可能包含多个测试样例。

对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。

矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。
输出:
对应每个测试案例,输出矩阵中面积最大的全0子矩阵的元素个数。
样例输入:
4 4
0 0 1 1
0 0 1 1
1 1 1 1
0 1 1 0

样例输出:4

程序如下:
import java.util.Scanner;

public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n, maxl, maxr, ans=0;
n = sc.nextInt();
int[][] a = new int[1005][1005];
int[][] l = new int[1005][1005];
int[][] r = new int[1005][1005];
int[][] h = new int[1005][1005];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
a[i][j] = sc.nextInt();
}
}
for (int i = 1; i <= n; i++) {
r[0][i] = n;
}
for (int i = 1; i <= n; i++) {
maxl = 1;
maxr = n;
for (int j = 1; j <= n; j++) {
if (a[i][j]==1) {
maxl = j + 1;
h[i][j] = l[i][j] = 0;

} else {
h[i][j]=h[i-1][j]+1;
l[i][j]=Math.max(maxl, l[i-1][j]);
}
}
for (int j = n; j >= 1; --j) {
if (a[i][j] == 1) {
maxr = j - 1;
r[i][j] = n;
} else {
r[i][j]=Math.min(maxr, r[i-1][j]);
ans=Math.max(ans, (r[i][j]-l[i][j]+1)*h[i][j]);
}
}

}
System.out.println(ans);

}

}

程序都经过小编耐心整理,编译通过后上传。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: