Q:最大正方形のみ含ま1及びその面積を返す見つけるために、2進数の0と1の2次元マトリクスを考えます。
例:
入力:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
出力:4
A:引用:https://blog.csdn.net/fly_fly_zhang/article/details/90637370
我々は、2次元マトリクスDP、DP [I] [J初期化 ] 正方形の最大辺の長さのその右下に発現します。それぞれが1を見つけ、元の行列を横断する、それは正方形の最大辺長の右下隅に努めます。
四角は小から大規模なプロセスに決定される:
ノード1かどうかを見て、
ルック2/ 2を満たす範囲条件。
N- /順次まで Nレンジ条件が満たされます。
したがって、これは確立の結果を使用DP処理ので、以前の結果に基づいて確立されます。
DP [I] [J]と同様に左上隅には、実際には、すでに知られているが、その起源の第二象限の主題です。私たちは、正方形の右下隅に設定するので、それはすでに条件の単なるアプリケーションです。
広場の他の3つの頂点の位置が実際の長辺にし、その隣に応じて得られるものの、それが推定されています。これは、以下の式が存在する:
\ [DP [I] [J] =分+ 1(DP [I-1] [J-1]、DP [I-1]〜[J]、DP [I、J-1]。。。。)。 \]
DP [1-I] [J-1]左上隅の位置
DP [I-1]〜[J ] 左下隅の位置を決定する
DPを[I、J-1]は、右上隅の位置を決定します。
正方形対応する位置の三辺の最小の長さを決定することができます。
public int maximalSquare(char[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0)
return 0;
int row=matrix.length;
int col=matrix[0].length;
int max=0;
//因为矩阵最上面的点是以它自己为一个矩阵的,但是为了计算方便
//我们假设它有
int [][] dp=new int[row+1][col+1];
for(int i=1;i<=row;i++){
for(int j=1;j<=col;j++){
if(matrix[i-1][j-1]=='1'){
//得到最短的正方形边长
dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;
max=Math.max(dp[i][j],max);
}
}
}
return max*max;
}