• 华为机考 给你一个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. }  

     

  • 相关阅读:
    diamond operator is not supported in -source 1.5
    ClassNotFoundException异常的解决方法
    serialVersionUID 的用途--转加自己的疑问
    java序列化---转
    junit类找不到的问题解决
    FastJson的基本用法----转
    sql字符串查找大小写敏感相关
    6.比较排序之快速排序
    有关ArrayList常用方法的源码解析
    5.比较排序之归并排序(非递归)
  • 原文地址:https://www.cnblogs.com/wwjldm/p/7112025.html
Copyright © 2020-2023  润新知