动态规划
主要思想
创建一个二维 dp
数组,接着遍历矩阵,然后在 dp
里面存储当前遍历到的最大的正方形的边长,最后取出 dp
的最大值,平方即面积。
状态转移方程
讨论区第一个那个图 其实已经很明了了,但我这里还是提一嘴。0
自然没什么问题;至于 min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1
,其中的 1
指的是当前块,min
大家想一下就知道了,类似于 短板效应,最大的 囊括当前块 的正方形当然取决于最短的那条边。
ps: 几个小技巧
- 巧用
map
取二维数组最值 - 一般而言
*
快于power
快于**
# # 最大正方形 # @param matrix char字符型二维数组 # @return int整型 # class Solution: def solve(self , matrix ): dp = [[0] * len(matrix[0]) for _ in range(len(matrix))] for i in range(len(matrix)): for j in range(len(matrix[0])): if matrix[i][j] == '0': dp[i][j] = 0 else: dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1 res = max(map(max, dp)) return res * res