análisis:
Este problema también se puede resolver con violencia.La mejor solución utiliza la idea de programación dinámica: este problema considera el área de un cuadrado, así que calcule la longitud del lado más largo. Suponemos que dp [i] [j] es la longitud del lado cuadrado más grande con [i] [j] como vértice. Podemos escribir la ecuación de transición de estado:
Si [i] [j] este punto es 1: entonces dp [i] [j] = min {dp [i-1] [j-1], dp [i-1] [j], dp [i] [ j-1]} + 1.
De lo contrario: dp [i] [j] = 0
Solución violenta:
Atraviesa cada elemento de la matriz y usa este elemento como la esquina superior izquierda del cuadrado para encontrar el área más grande. La complejidad es O (n * n). Este tipo de algoritmo tiene muchos cálculos repetidos. Por ejemplo, el cálculo de
[0] [0] en la esquina superior izquierda es necesario, pero el cálculo de [1] [1] se repite. Porque la matriz cuadrada formada por [1] [1] elementos es un subconjunto de [0] [0] elementos. Por lo tanto, asumimos que dp [i] [j] es la longitud máxima del lado cuadrado con [i] [j] como vértice en el pensamiento de programación dinámica.
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);
}
}
}