221.最大正方形(动态规划)

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

上班之余还是要保持稳定的刷题习惯。

做完本题后回忆了四道DP的题: 爬楼梯,打家劫舍,最短路径和,最大正方形。

发现动态规划思考量最大的还是动态转移方程

1.本题的关键点就是想通,状态转移方程,dp[ i ][ j ] = min(dp[ i-1 ][ j-1 ] , dp[ i-1 ][ j ] , dp[ i ][ j-1 ]) + 1, 可以结合上图想一下 边长2推出边长3的过程。

2.由于第一行第一列的元素是没有三个相邻元素来索引,所以需要构造半层padding

  dp = [ [ 0 for _ in range(n+1)] for _ in range(m+1) ]

代码:

class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        if not matrix: return 0 
        
        m = len(matrix)
        n = len(matrix[0])
        dp = [[0 for _ in range(n+1)] for _ in range(m+1)]
        for i in range(1,m+1):
            for j in range(1,n+1):
                if matrix[i-1][j-1] == '1':
                    dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1
        maxlist = [max(row) for row in dp]
        print(dp)
        return max(maxlist)**2

猜你喜欢

转载自www.cnblogs.com/ChevisZhang/p/12349768.html