前言:这道题目我感觉确定状态反而是比较难的一件事
确定状态
设dp[i][j]代表到i行,j列的最大的正方形边长
因为某一个点的最大正方形边长实际上是受他左边的点,上面的点,以及左上角的点影响的。
我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情况是是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点就可以构成一个更大的正方形。 但如果它的上方,左方和左上方为右下角的正方形的大小不一样,合起来就会缺了某个角落,这时候只能取那三个正方形中最小的正方形的边长加1了
状态转移方程
dp[i][j] = 0 {matrix[i][j]==0}
= min{dp[i][j-1],dp[i-1,j],dp[i-1][j-1]}+1 {matrix[i][j]==1}
初始条件和边界条件
计算顺序
dp[0][0] dp[1][0]...dp[n][0]
....
dp[n][0] dp[n][1] ...dp[n][n]
代码
class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix.length==0||matrix==null)return 0;
int [][]dp=new int [matrix.length+1][matrix[0].length+1];
int res=0;
for(int i=1;i<=matrix.length;i++){
for(int j=1;j<=matrix[0].length;j++){
if(matrix[i-1][j-1]=='1'){
dp[i][j]=Math.min(Math.min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;
res=Math.max(res,dp[i][j]);
}
}
}
return res*res;
}
}