寻找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);
}
}
程序都经过小编耐心整理,编译通过后上传。
在一个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);
}
}
程序都经过小编耐心整理,编译通过后上传。
相关文章推荐
- 经典面试题--寻找01矩阵中最大的1矩形(POJ 3494)
- 寻找01矩阵中最大的子矩阵 Maximal Rectangle
- [LeetCode] 01矩阵中最大矩形 Maximal Rectangle
- CodeForces 22B Bargaining Table 01矩阵求最大矩形面积
- 2014华为机试,迷宫矩阵寻找单词的存在与否
- 九度OJ 1497:面积最大的全1子矩阵(DP)
- 南阳oj448:寻找最大数
- 华为OJ 201301 JAVA题目0-1级
- 【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组
- Java-寻找矩阵连通域个数
- 九度OJ; 题目1497:面积最大的全1子矩阵
- UVa 836 - Largest Submatrix ( 最大01矩阵)
- HDU 2236 矩阵不同行列寻找 最小最大数的差值 最小 二分匹配+二分枚举区间
- 2014华为机试,迷宫矩阵寻找单词的存在与否
- 0 1矩阵内寻找最大m*m的全0矩阵块
- 用幂法求矩阵的最大近似特征值 (JAVA)
- 在O(n^2)内寻找矩阵A中 A(c,d) - A(a,b) 的最大值, c > a 且 d > b.
- 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划
- 华为oj题目 DNA序列 [java语言]
- 华为机试—寻找丑数 && 九度OJ 1214