###221. Maximal Square
题目: https://leetcode.com/problems/maximal-square/
难度: Medium
tag: DP
递推公式,一开始想的很简单:
dp[i][j] = dp[i-1][j-1] + 1 #如果dp[i-1][j-1]为1,dp[i-1][j]为1,dp[i][j-1]为1
很明显的错误,一旦遇到更大的方块就会有问题
然后看了hint,其实递推方程式是很有技巧的,左上角,左边,上面,相邻的三个部分最小的+1,当然,前提也是要这里dp[i][j] 为1,然后我们再会去看其他的部分。
看个例子
原本的matrix DP
1 0 1 0 0 1 0 1 0 0
1 0 1 1 1 → 1 0 1 1 1
1 1 1 1 1 1 1 1 2 2
1 0 0 1 0 1 0 0 1 0
是非常make sense的,因为最小的必定包括了周边的1,然后再加1,否则如果是0的话那么就为0.
而naïve的错误的递推公式是因为一个square考虑的部分是k * k的部分, k * k 部分都必定为1.
而正确的递推公式
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1
则完美的考虑了这一情况
class Solution(object):
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
dp = []
for i in matrix:
tmp = []
for j in i:
tmp.append(int(j))
dp.append(tmp)
row = len(dp)
col = len(dp[0]) if row else 0
for i in range(1,row):
for j in range(1,col):
if dp[i][j] == 1:
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1]) + 1
maxv = 0
for i in range(row):
for j in range(col):
if dp[i][j] > maxv:
maxv = dp[i][j]
return maxv * maxv