解题思路:
根据DP解题的三步骤
1.确定dp[][]数组的含义
此题的dp[i][j],代表以坐标为(i,j)的元素为右下角的正方形的边长。
2.状态转移方程
dp[i][j]的值取决于dp[i-1][j],dp[i-1][j-1],dp[i][j-1]的最小值
即左方正方形的边长,左上方正方形的边长,上方正方形的边长三者的最小值。
3.边界
由于状态转移方程中涉及i-1,j-1,所以i和j一定要大于0.
故dp[0][] 和 dp[][0]要首先确定。
#=============================================================================================
'''
#
# 最大正方形
# @param matrix char字符型二维数组
# @return int整型
#
class Solution:
def solve(self , matrix ):
# write code here
m = matrix
#for i in m:
# print('m=',i)
r = len(m)
c = len(m[0])
dp = [[0]*c for _ in range(r)]
maxLen = 0
for i in range(r):
for j in range(c):
if (i==0 or j==0) and m[i][j]==1:
dp[i][j] = 1
elif m[i][j]==1:
dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1
if dp[i][j]>maxLen:
maxLen = dp[i][j]
#for i in dp:
# print('dp=',i)
#print('maxLen=',maxLen)
return maxLen*maxLen
# 此题牛客原题中输入的是“字符型”二维数组,这里是“数字型”
m = [[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]] # 4
s = Solution()
print(s.solve(m))