2019 Huawei Summer Internship Test Questions Java (Étant donné une matrice bidimensionnelle 0/1, trouvez et retournez la plus grande surface carrée composée de 1) - programmation dynamique

Insérez la description de l'image ici
une analyse:

Ce problème peut aussi être résolu avec violence.La meilleure solution utilise l'idée de programmation dynamique: ce problème considère l'aire d'un carré, il suffit donc de calculer la longueur de côté la plus longue. Nous supposons que dp [i] [j] est la plus grande longueur de côté carré avec [i] [j] comme sommet. Nous pouvons écrire l'équation de transition d'état:

Si [i] [j] ce point est 1: alors dp [i] [j] = min {dp [i-1] [j-1], dp [i-1] [j], dp [i] [ j-1]} + 1.

Sinon: dp [i] [j] = 0

Solution violente:

Traversez chaque élément de la matrice et utilisez cet élément comme coin supérieur gauche du carré pour trouver la plus grande surface. La complexité est O (n * n). Ce type d'algorithme a beaucoup de calculs répétés. Par exemple, le calcul de \ begin {bmatrix} 3 3 3 \ 3 3 3 \ 3 3 3 \ end {bmatrix}
[0] [0] dans le coin supérieur gauche est nécessaire, mais le calcul de [1] [1] est répété. Parce que la matrice carrée formée par [1] [1] éléments est un sous-ensemble de [0] [0] éléments. Par conséquent, nous supposons que dp [i] [j] est la longueur maximale du côté carré avec [i] [j] comme sommet dans la pensée de programmation dynamique.

import java.util.Scanner;
 
/**
 * @author: Mr.Hu
 * @create: 2019-03-13 21:10
 */
public class Main{
    
    
    public static void main(String[] args) {
    
    
        Scanner sc =new Scanner(System.in);
        while (sc.hasNextInt()){
    
    
            int n=sc.nextInt();
            char[][] a =new char[n][];
            for (int i = 0; i < n; i++) {
    
           //输入变为二维整形数组
                a[i] =sc.next().toCharArray();
            }
            int[][] dp =new int[n][a[0].length];  //dp 存以a[i][j]结尾最长的边长  注意输入数据不一定是正方形
            int max=0;
            for (int i = 0; i < n; i++) {
    
               //将字符数组变为整形数组
                for (int j = 0; j <a[i].length ; j++) {
    
    
                    dp[i][j]=a[i][j]-'0';
                    if (dp[i][j]==1) max=1;
                }
            }
            for (int i = 1; i < n; i++) {
    
    
                for (int j = 1; j <a[i].length; j++) {
    
    
                    if (a[i][j]=='1'){
    
    
                        int temp =Math.min(dp[i-1][j-1],dp[i-1][j]);
                        temp =Math.min(temp,dp[i][j-1])+1;
                        dp[i][j]=temp;
                        max=max<temp?temp:max;
                    }
                    else dp[i][j]=0;
                }
            }
            System.out.println(max*max);
        }
    }
 
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_41076577/article/details/108328418
conseillé
Classement