此题和leetcode 85 最大矩形几乎是一样的题目,只是那个题是矩形。
矩形的题目用单调栈做,而此题一看就是要dp的。
然而,此题的dp定义并不好想。
我们定义
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示以
i
,
j
i,j
i,j 结尾的最大边长,则
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
]
[
j
−
1
]
,
d
p
[
i
−
1
]
[
j
]
,
d
p
[
i
−
1
]
[
j
−
1
]
)
+
1
dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1])+1
dp[i][j]=min(dp[i][j−1],dp[i−1][j],dp[i−1][j−1])+1
必须上,左,斜上都能构成正方形,才能传播。这是非常妙的一个动态规划,因为正常可能只考虑左上角的,然后再看左边,上面有没有连续的1,但是这种dp方式就规避了这个麻烦点。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
int dp[m+1][n+1];
memset(dp, 0, sizeof(dp));
int ans = 0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(matrix[i-1][j-1] == '1')
{
dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]})+1;
if(dp[i][j] > ans)ans = dp[i][j];
}
}
}
return ans*ans;
}
};