1. 程式人生 > >尋找01矩陣中的最大子矩陣--華為OJ機試--java語言版

尋找01矩陣中的最大子矩陣--華為OJ機試--java語言版

題目描述:

在一個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);


}
}

程式都經過小編耐心整理,編譯通過後上傳。