华为机考 给你一个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],如果是的话,赋值。

代码如下:

  1. import java.util.Scanner;  
  2.   
  3. public class Main88 {  
  4.   
  5.     /* 
  6.      * 给你一个N*M的矩阵,每个位置的值是0或1, 求一个面积最大的子矩阵,这个矩阵必须是一个正方形, 
  7.      * 且里面只能由1构成,输出最大的正方形边长。其中n,m<=400; 
  8.      */  
  9.   
  10.     public static void main(String args[]) {  
  11.         Scanner sc = new Scanner(System.in);  
  12.         int m, n;  
  13.   
  14.         while (true) {  
  15.             m = sc.nextInt();  
  16.             n = sc.nextInt();  
  17.             int[][] a = new int[m][n];  
  18.             for (int i = 0; i < m; i++)  
  19.                 for (int j = 0; j < n; j++)  
  20.                     a[i][j] = sc.nextInt();  
  21.             // 通过cout函数求得最大边长  
  22.             int s = cout(a, m, n);  
  23.             System.out.println(s);  
  24.         }  
  25.   
  26.     }  
  27.   
  28.     // 求矩阵构成正方形最大边长的函数  
  29.     private static int cout(int[][] a, int m, int n) {  
  30.         // TODO Auto-generated method stub  
  31.         int max = -1;  
  32.         for (int i = 1; i < m; i++)  
  33.             for (int j = 1; j < n; j++) {  
  34.                 if (a[i][j] == 1) {  
  35.                     int min = a[i - 1][j - 1];  
  36.                     if (a[i - 1][j] < min)  
  37.                         min = a[i - 1][j];  
  38.                     if (a[i][j - 1] < min)  
  39.                         min = a[i][j - 1];  
  40.                     a[i][j] += min;  
  41.                     if (max < a[i][j])  
  42.                         max = a[i][j];  
  43.                 }  
  44.   
  45.             }  
  46.         return max;  
  47.     }  
  48. }  

 

原文地址:https://www.cnblogs.com/wwjldm/p/7112025.html