- dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1,如果i>0且j>0
递推公式的含义是,以(i, j)为右下角的正方形的边长,取决于其左上方、上方、左方的正方形的最大边长,取最小值再加1即可。 - 有了dp数组之后,只需要遍历矩阵中的每个位置,更新dp数组的值,同时统计边长为k的全为1的正方形矩阵的个数或者找到其中一个最大的全为1正方形矩阵。
def count_squares(matrix, k):
"""
:param matrix: 01矩阵
:param k: 正方形边长
:return: 边长为k的全为1的正方形矩阵的个数
"""
if not matrix:
return 0
m, n = len(matrix), len(matrix[0])
aux = [[0] * n for _ in range(m)]
count = 0
for i in range(m):
for j in range(n):
if matrix[i][j] == 0:
aux[i][j] = 0
else:
if i == 0 or j == 0:
aux[i][j] = 1
else:
aux[i][j] = min(aux[i-1][j-1], aux[i-1][j], aux[i][j-1]) + 1
if aux[i][j] >= k:
count += 1
return count
matrix1 = [[1, 1, 1],
[1, 1, 1],
[1, 1, 1]]
k1 = 2
print(count_squares(matrix1, k1))
matrix2 = [[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1]]
k2 = 2
print(count_squares(matrix2, k2))
matrix3 = [[1, 1, 1, 0, 0],
[1, 1, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 1, 1, 1, 1]]
k3 = 3
print(count_squares(matrix3, k3))
matrix4 = [[1, 1, 1],
[1, 0, 1],
[1, 1, 1]]
k4 = 2
print(count_squares(matrix4, k4))
matrix5 = [[1, 1, 1],
[1, 0, 1],
[1, 0, 1]]
k5 = 2
print(count_squares(matrix5, k5))
matrix6=[[0,0,0,0,0],
[0,1,1,1,1],
[0,1,1,1,1],
[0,1,0,0,1],
[0,1,1,1,1]]
k6 = 2
print(count_squares(matrix6, k6))
matrix7=[]
k7=1
print(count_squares(matrix7, k7))