- 动态规划
自个儿写的,支棱.jpg。开始只知道动态规划,然后是具体动手模拟一遍,初始状态、转移方程就自然而然出来了。
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
# 动态规划
# dp[i][j] 存的是以当前位置为【最大正方形的右下角】,这个正方形的边长。
# maxlen 存最大正方形的边长
row, col = len(matrix), len(matrix[0])
dp = [[0] * col for _ in range(row)]
maxlen = 0
# print(dp)
# 初始化
for j in range(col):
if matrix[0][j] == '1':
dp[0][j] = 1
maxlen = 1
for i in range(row):
if matrix[i][0] == '1':
dp[i][0] = 1
maxlen = 1
# print(dp)
for i in range(1, row):
for j in range(1, col):
if matrix[i][j] == '1' :
dp[i][j] = 1
if dp[i-1][j-1] and dp[i][j-1] and dp[i-1][j]:
dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
maxlen = max(maxlen, dp[i][j])
return maxlen * maxlen
可以简化
# print(dp)
for i in range(1, row):
for j in range(1, col):
if matrix[i][j] == '1' :
dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
maxlen = max(maxlen, dp[i][j])
具体没懂得可看官方解析