Leetcode221最大の広場 - ダイナミックプログラミング(状態遷移方程式を)理解して再帰

記事のディレクトリ

導入

この質問は、最大の広場が221本です。

0と1からなる2次元マトリクス状に、最大正方形は1つだけが含まれ、その面積を返す検索します。
例:
入力:
。1 1 0 0
1 0 1 1 1
1 1 1 1 1
1 1 0 0 0。
出力:4

明らかに解決策を見つけることは容易で動的計画法、動的計画方程式ではなく、を使用することです。

221問題の最大の二乗解

理解分(上、左、左上)+ 1
で述べたように、次の形式のコードに関連する問題:

if (grid(i, j) == 1) {
    dp(i, j) = min(dp(i-1, j), dp(i, j-1), dp(i-1, j-1)) + 1;
}

中国語に翻訳:
正方形上、正方形又は左の左上、最小のものに加え、このボックスに正方形:グリッドが1である場合、これは、正方形の右下隅、最大辺の長さです。

精巧なコンセンサスにまずシンプル:

  • フォームは、正方形(非単1)は、現在の右下隅の視点で見ている場合は、次のものが必要です。現在のグリッドを、左側に、左上の1であります
  • 現在のグリッド、左側に、左上が正方形になるために0を制限することができません:それは別の角度かもしれ

直接地図上で理解しやすい
ここに画像を挿入説明
それはちょうど短いバレルプレート理論として、交差点の四角の3(上段左、左、上)側を取ること、です。

以下のように、この質問のコードは次のとおりです。

public int maximalSquare(char[][] matrix) {
    // base condition
    if (matrix == null || matrix.length < 1 || matrix[0].length < 1) return 0;

    int height = matrix.length;
    int width = matrix[0].length;
    int maxSide = 0;

    // 相当于已经预处理新增第一行、第一列均为0
    int[][] dp = new int[height + 1][width + 1];

    for (int row = 0; row < height; row++) {
        for (int col = 0; col < width; col++) {
            if (matrix[row][col] == '1') {
                dp[row + 1][col + 1] = Math.min(Math.min(dp[row + 1][col], dp[row][col + 1]), dp[row][col]) + 1;
                maxSide = Math.max(maxSide, dp[row + 1][col + 1]);
            }
        }
    }
    return maxSide * maxSide;
}

同様に、タイトルを見て:1277統計はすべて正方形のサブマトリクス1です、まだ同じアイデアを使用しています。
コードは以下の通りであります:

class Solution {
    public int countSquares(int[][] matrix) {
        if (matrix==null||matrix.length==0||matrix[0].length==0) return 0;
        int row=matrix.length;
        int col=matrix[0].length;
        int count=0;
        int[][] dp=new int[row+1][col+1];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(matrix[i][j]==1){
                    dp[i+1][j+1]=Math.min(Math.min(dp[i+1][j],dp[i][j+1]),dp[i][j])+1;
                    count+=dp[i+1][j+1];
                }
            }
        }
        return count;
    }
}

ここで使用されるようにcount+=dp[i+1][j+1];、この場合は正しいと考えることができる理由を考えますか?

そのような入力として:マトリックス=
[
[0、1,1,1]、
[1、1,1,1]、
[0、1,1、1]
]

私たちはどのように行う多くの正方形追加し、新しいものの右下隅に参加しますか?3、DPのちょうど辺の長さ。

公開された392元の記事 ウォンの賞賛326 ビュー160 000 +

おすすめ

転載: blog.csdn.net/No_Game_No_Life_/article/details/104513780