三面列举了三种不同最小值所在的位置,可以看出只要当前元素为1,那么dp[i][j]就等于左上,左、上,中的最小值加1。
比如图一种最小值为3。问号所在位置元素为1,那么dp问号处的值就为4,因为当取三者最小值的时候,其余两个4,4所在位置的元素肯定为1。不然此处的dp值肯定比3还小。
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { int m = matrix.size(); int n = matrix[0].size(); vector<vector<int>> dp(m,vector<int>(n,0)); int maxval = INT_MIN; // dp[i][j]: 包含matrix[i][j]在内的最大正方形的边长 for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(matrix[i][j] == '1'){ if(i==0||j==0) // 左、上边界,且当前元素为1,则 dp[i][j]为1 dp[i][j] = 1; else dp[i][j] = min(dp[i][j-1],min(dp[i-1][j-1],dp[i-1][j]))+1; } maxval = max(maxval, dp[i][j]); } } return maxval*maxval; } };