尋找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);
}
}
程式都經過小編耐心整理,編譯通過後上傳。