视频连接:https://www.bilibili.com/video/BV1po4y1d7C9/

class Solution:
    def solve(self , matrix ):
        if not matrix: return 0
        rows = len(matrix)
        cols = len(matrix[0])
        dp = [[0 for _ in range(cols)] for _ in range(rows)]
        res = 0

        # 上边界或者左边界 最大只可能有 1的矩阵 
        for i in range(rows):
            if matrix[i][0] == '1': 
                dp[i][0] = 1
        for j in range(cols): 
            if matrix[0][j] == '1':
                dp[0][j] = 1

        for row in range(1, rows):
            for col in range(1, cols):
                if matrix[row][col] == '1':
                    # 从左、左上、上 三个方向 判断是否 能够组成 最大矩阵
                    dp[row][col] = min(dp[row-1][col], dp[row][col-1], dp[row-1][col-1]) + 1
                    # 更新 最大值
                    res = max(res, dp[row][col])
        return res*res