华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
此问题主要是求一个数组的最大连续相同字符的正方形的问题,比如
0 1 1 1 1 1
0 1 1 1 1 1
1 1 1 1 1 1
0 0 0 0 0 0
得出来得的是
输出边长也就是3;
具体思路:
先从a[1][1]开始,循环至结尾,每一次都执行以下循环体:
比较a[]i-1[j-1],a[i][j-1],a[i-1][j],选出最小的,然后加到a[i][j]里,判断全局变量的max是否小于a[i][j],如果是的话,赋值。
代码如下:
- import java.util.Scanner;
- public class Main88 {
- /*
- * 给你一个N*M的矩阵,每个位置的值是0或1, 求一个面积最大的子矩阵,这个矩阵必须是一个正方形,
- * 且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
- */
- public static void main(String args[]) {
- Scanner sc = new Scanner(System.in);
- int m, n;
- while (true) {
- m = sc.nextInt();
- n = sc.nextInt();
- int[][] a = new int[m][n];
- for (int i = 0; i < m; i++)
- for (int j = 0; j < n; j++)
- a[i][j] = sc.nextInt();
- // 通过cout函数求得最大边长
- int s = cout(a, m, n);
- System.out.println(s);
- }
- }
- // 求矩阵构成正方形最大边长的函数
- private static int cout(int[][] a, int m, int n) {
- // TODO Auto-generated method stub
- int max = -1;
- for (int i = 1; i < m; i++)
- for (int j = 1; j < n; j++) {
- if (a[i][j] == 1) {
- int min = a[i - 1][j - 1];
- if (a[i - 1][j] < min)
- min = a[i - 1][j];
- if (a[i][j - 1] < min)
- min = a[i][j - 1];
- a[i][j] += min;
- if (max < a[i][j])
- max = a[i][j];
- }
- }
- return max;
- }
- }
posted on 2017-07-03 17:09 WenjieWangFlyToWorld 阅读(227) 评论(0) 编辑 收藏 举报