LintCode刷题笔记-- Maximal Square
标签:动态规划
题目描述:
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
Example
For example, given the following matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 4
.
解题思路:
1.这一题明显使用动态规划来解题,开始想法使用动态规划的方法来记录所有1连在一起的面积,之后记录该面积右下角的坐标,之后通过遍历一个方向的坐标来得到一条边长,之后使用面积来相除,得到一条短边的长度,即可求出正方形面积。但是这么做存在一个问题,即,面积所得出的结果是两边相乘的结果,如果体现在一个数值上,是无法应用到下一子状态的:比如,2*6=12 先前子状态最大面积为12,然而在下一子状态中是无法确定12是从何而来,可能是3*4,可能是2*6。无法使用一个数值来记录两个变量。
2. 随即求助于其他解法,如果一个点是一个正方形的右下角,那么它的左上,上方和左方一定存在着至少存在一个正方形,最优情况是三个正方形的边长是相同的,这样直接在边长上加上1就会构成一个新的正方形,然而如果三个方向的正方形不等的话如果选择最大的边长,就会在某个方向上缺失一角。所以正确的方式是找出最小的一个正方形之后加上1,构成新的正方形。
3.如果matrix的位置上为0,则之前所积累的正方形边长将会中断,所有在为0的dp[i][j]上的位置为0
参考代码:
public int maxSquare(int[][] matrix) { // write your code here int row = matrix.length; int colum = matrix[0].length; int[][] dp = new int[row][colum]; int max = 0; dp[0][0] = matrix[0][0]; for(int i=1; i<row; i++){ dp[i][0] = matrix[i][0]; max = Math.max(dp[i][0], max); } for(int j=1; j<colum; j++){ dp[0][j] = matrix[0][j]; max = Math.max(dp[0][j],max); } for(int i=1; i<row; i++){ for(int j=1; j<colum; j++){ dp[i][j] = matrix[i][j]==1?Math.min(dp[i-1][j-1], Math.min(dp[i-1][j],dp[i][j-1]))+1:0; max = Math.max(max, dp[i][j]); } } return max*max; }