leetcode 221. 最大正方形
题目如下
数据范围
典型的动态规划题。
令f(i,j)为以i,j为右下角左边正方形的最大边长,
当且仅当f(i,j) > 0(即 矩阵(ij)不为’0’)时
f(i,j) = min(f(i,j - 1),f(i - 1,j - 1),f(i - 1,j))
对这个方程不太理解的话借用leetcode官方的图
也就是说边长为n的正方形可以由3个边长n-1的正方形以及边长1的正方形组成。
通过代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int max1 = 0;
vector<vector<int>> dp(m,vector<int>(n));
for(int i = 0;i < m;i++) {
for(int j = 0;j < n;j++) {
if(matrix[i][j] == '1'){dp[i][j] = 1;max1 = 1;}
else dp[i][j] = 0;
}
}
for(int i = 1;i < m;i++) {
for(int j = 1;j < n;j++) {
if(dp[i][j] == 1) dp[i][j] = min(min(dp[i - 1][j - 1],dp[i - 1][j]),dp[i][j - 1]) + 1;
max1 = max(max1,dp[i][j]);
}
}
return max1 * max1;
}
};