package leetcode;
public class demo_221 {
public int maximalSquare(char[][] matrix) {
if(matrix.length<0||matrix==null) {
return 0;
}
int hegiht=matrix.length;
int width=matrix[0].length;
//以dp[i][j]为右下角的最大正方形边长
int[][]dp=new int[hegiht][width];
int max=0;
//第一行和第一列dp[i][j]最大只可能为1
for(int i=0;i<width;i++) {
if(matrix[0][i]=='1') {
dp[0][i]=1;
max=1;
}
}
for(int i=0;i<hegiht;i++) {
if(matrix[i][0]=='1') {
dp[i][0]=1;
max=1;
}
}
for(int i=1;i<hegiht;i++) {
for(int j=1;j<width;j++) {
//如果得当前值为0,则不可能为正方形
if(matrix[i][j]=='0') {continue;}
//动态规划,左方、上方、左上方中满足正方形的最小边长加一
dp[i][j]=Math.min(dp[i-1][j], Math.min(dp[i][j-1], dp[i-1][j-1]))+1;
if(dp[i][j]*dp[i][j]>max) {
max=dp[i][j]*dp[i][j];
}
}
}
System.out.println(max);
return max;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
demo_221 demo=new demo_221();
char[][] matrix= {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};
demo.maximalSquare(matrix);
}
}