解题思路: 根据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))