7.3Maximal Square 基本动态规划:二维
题目描述
给定一个二维0-1矩阵,求全由1构成的最大正方形面积
输入输出样例
Input :
\["1","0","1","0","0"\], \["1","0","1","1","1"\], \["1","1","1","1","1"\], \["1","0","0","1","0"\]
Output:4
题解
动态规划问题,还是看看能不能转换为数组求解。定义一个二维dp数组,dp[i][j]表示满足题目条件的,以(i,j)为右下角的正方形或者是长方形的属性。对于这个题就是表示以(i,j)为右下角的圈1构成的最大正方形面积。如果当前位置是0,那么dp[i][j] = 0.如果当前是1,假设dp[i][j] = k^2,他的充分条件就是dp[i-1][j-1],dp[i][j-1],和dp[i-1][j]的值必须不小于(k-1)^2。否则(i,j)位置不可以构成一个边长为k的正方形。所以,如果这三个值的最小值为k-1,则(i,j)位置一定且最大可以构成一个边长为k的正方形。
cpp
#include <iostream>
#include <vector>
using namespace std;
int maximalSquare(vector<vector<char>>& matrix){
if (matrix.empty() || matrix[0].empty()) {
return 0;
}
int m = matrix.size(), n = matrix[0].size(), max_side = 0;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 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 - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
}
max_side = max(max_side, dp[i][j]);
}
}
return max_side * max_side;
}
int main() {
vector<vector<char>> matrix = {
{'1','0','1','0','0'},
{'1','0','1','1','1'},
{'1','1','1','1','1'},
{'1','0','0','1','0'}
};
cout << maximalSquare(matrix) << endl;
return 0;
}