class Solution {
public:
    int maximalSquare(vector<vector<char>>& mat) {
        int m = mat.size(), n = mat[0].size(), max_width = 0;
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for (int i = 1; i <= m; i ++) {
            for (int j = 1; j <= n; j ++) {
                if (mat[i - 1][j - 1] == '1') {
                    dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
                }
                max_width = max(max_width, dp[i][j]);
            }
        }
        return max_width * max_width;
    }
};

可以使用动态规划降低时间复杂度。我们用 dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值。如果我们能计算出所有 dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 1 的正方形的边长最大值,其平方即为最大正方形的面积。

作者:LeetCode-Solution 链接:https://leetcode.cn/problems/maximal-square/solution/zui-da-zheng-fang-xing-by-leetcode-solution/

[1277. 统计全为 1 的正方形子矩阵](https://qiekn.notion.site/1277-1-7bb077e38fa64c4ea58ed54840a76248)