华为机试题:输入一个二维01矩阵,判断矩阵中全为1的正方形的最大边长

  • 输入一个二维01矩阵,判断矩阵中全为1的正方形的最大边长

输入如下:第一行输入一个整数数N,表示矩阵的行数,接下来输入N行,示例如下:

5
0 1 1 0 1 0
1 1 1 0 1 1
0 1 1 1 1 0
0 0 0 1 0 1
1 1 0 0 0 0 

 典型的DP问题,把矩阵阵中的每个点作为正方形右下角点来处理,则以该点为右下角点的正方形的最大边长,最多比以它的左方、上方和左上方为右下角的正方形边长多1。用d[i][j]表示以i,j坐标为右下角的正方形最大边。则有状态转移方程:dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1,具体代码如下:

import java.util.*;
public class fs {
public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	int N = in.nextInt();
	in.nextLine();
	
	String [] str = in.nextLine().split(" ");
	int M = str.length;
	int [][] arr = new int [N][M];
	for (int i = 0; i < N; i++) {
		arr[0][i] = Integer.parseInt(str[i]);
	}
	for (int i = 1; i < N; i++) {
		String [] s1 = in.nextLine().split(" ");
        for (int j = 0; j < s1.length; j++) {
			arr[i][j] = Integer.parseInt(s1[j]);
		}
	}
	System.out.println(getmax(arr));;
}
public static int getmax(int[][] arr) {
	if(arr.length ==0 || arr[0].length==0)
	{
		return 0;
	}
	int M =arr.length;
	int N =arr[0].length;
	int res =0;
	int [][]dp = new int [M][N];
	for (int i = 0; i < M; i++) {
		if(arr[i][0] == 1) {
			dp[i][0] =1;
			res  =1 ;
		}		
	}
	for (int i = 0; i < N; i++) {
		if(arr[0][i] == 1) {
			dp[0][i] =1;
			res  =1 ;
		}		
	}
	for (int i = 1; i < M; i++) {
		for (int j = 1; j < N; j++) {
			if(arr[i][j] == 1) {				
				int min1 = dp[i-1][j]< dp[i][j-1]? dp[i-1][j]:dp[i][j-1];
				dp[i][j] = dp[i-1][j-1]< min1? dp[i-1][j-1]+1:min1+1;
			}
			res = res > dp[i][j]? res:dp[i][j];
		}	
	}
	return res;

}
}

 

你可能感兴趣的:(笔试算法题)