版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014491519/article/details/78827574
描述
给定一个NxM的01矩阵,小Hi希望从中找到一个01间隔的子方阵,并且方阵的边长越大越好。
例如对于
0100100
1000101
0101010
1010101
0101010
在右下角有一个4x4的01间隔方阵
代码(动态规划):
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
String ss = scan.nextLine();
String[] str = ss.split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
int[][] dp = new int[n][m];
if(m < 2 || n < 2){
System.out.println(-1);
return;
}
String[] matrix = new String[n];
for(int i = 0;i < n;i++){
matrix[i] = scan.nextLine();
}
for(int i = 0;i < n;i++){
for(int j = 0;j < m;j++){
dp[i][j] = 1;
}
}
int max = -1;
for(int i = 1;i < n;i++){
for(int j = 1;j < m;j++){
if(!(matrix[i].charAt(j) != matrix[i].charAt(j-1) &&
matrix[i].charAt(j) != matrix[i-1].charAt(j))){
continue;
}
int top = dp[i][j-1];
int left = dp[i-1][j];
int tmp = Math.min(top,left);
if(matrix[i-tmp].charAt(j-tmp) != matrix[i-tmp+1].charAt(j-tmp)
&& matrix[i-tmp].charAt(j-tmp) != matrix[i-tmp].charAt(j-tmp+1))
dp[i][j] = tmp+1;
else dp[i][j] = tmp;
max = max > dp[i][j]?max:dp[i][j];
}
}
System.out.println(max);
}
}