在一个由 ‘0‘ 和 ‘1‘ 组成的二维矩阵内,找到只包含 ‘1‘ 的最大正方形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4
动态规划
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
// 正方形,因此寻找边长即可
// dp[i][j], 表示以i,j为右下角的正方形边长。
// dp[i-1][j], dp[i-1][j-1], dp[i][j-1]中最短的边长, 再加上matrix[i][j]
int m = matrix.size(), n = matrix[0].size(), ans = 0;
vector<vector<int>> dp(m, vector<int>(n,0));
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
// 边界条件
if(!i)
dp[0][j] = (matrix[0][j] == ‘1‘);
else if(!j)
dp[i][0] = (matrix[i][0] == ‘1‘);
// 更新方程
else if( matrix[i][j] == ‘1‘){
int tmp = min(dp[i-1][j], dp[i][j-1]);
dp[i][j] = min(tmp, dp[i-1][j-1]) + 1;
}
ans = max(ans, dp[i][j]);
}
}
return ans*ans;
}
};
原文:https://www.cnblogs.com/alyosha/p/14646301.html