题目题解是这么说的,定义一个二维dp数组
其中dp[i][j]表示以nums[i][j]为右下角的最大正方形
对于任意dp[i][j],如果dp[i][j]0,那它必不可能组成正方形,所以置0
对于dp[i][j]k,只有dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]都不小于k-1才有可能组成正方形
如果只有两个或一个满足,则dp[i][j]=k-1
另外是需要一个最大数字来保存最大“边长”?
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size(),n = matrix[0].size();
vector<vector<int>> dp(m,vector<int>(n,0));
int maxSideLength = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 初始化
if (i == 0 && matrix[i][j] == '1') dp[i][j] = 1;
if (j == 0 && matrix[i][j] == '1') dp[i][j] = 1;
if (i>0&&j>0&&matrix[i][j] == '1') dp[i][j] = min(min(dp[i - 1][j], dp[i - 1][j - 1]), dp[i][j - 1])+1;
if (dp[i][j] > maxSideLength) maxSideLength = dp[i][j];
}
}
return pow(maxSideLength, 2);
}
这样,虽然我现在还没想明白为什么能这样,可能动态规划最难的就是想dp数组的定义了
尝试用三个变量替代dp数组做空间优化?感觉这个dp数组不是很好去掉的,得不偿失,但空间效率确实又比较差
还是就先这样吧