题解 | #最大正方形#
最大正方形
https://www.nowcoder.com/practice/0058c4092cec44c2975e38223f10470e
#include <algorithm> #include <climits> #include <cmath> #include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 最大正方形 * @param matrix char字符型vector<vector<>> * @return int整型 */ //设dp[i][j]为以[i,j]为右下角的最大正方形面积 //if(matrix[i][j]=='1'),min_area=min(dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]) //dp[i][j]=min_area+square(min_area)*2+1 int solve(vector<vector<char> >& matrix) { // write code here if (matrix.size() == 0) { return 0; } else if (matrix.size() == 1 && matrix[0][0] == '1') { return 1; } else if (matrix.size() == 1 && matrix[0][0] == '0') { return 0; } vector<vector<int>>dp(matrix.size(), vector<int>(matrix[0].size(), 0)); int max_area = 0; for (int j = 0; j < matrix[0].size(); j++) { if (matrix[0][j] == '1') { dp[0][j] = 1; max_area = 1; } else { dp[0][j] = 0; } } for (int i = 0; i < matrix.size(); i++) { if (matrix[i][0] == '1') { dp[i][0] = 1; max_area = 1; } else { dp[i][0] = 0; } } for (int i = 1; i < matrix.size(); i++) { for (int j = 1; j < matrix[0].size(); j++) { if (matrix[i][j] == '1') { int min_area = min(dp[i - 1][j - 1], dp[i - 1][j]); min_area = min(min_area, dp[i][j - 1]); dp[i][j] = min_area + sqrt(min_area) * 2 + 1; max_area = max(max_area, dp[i][j]); } else { dp[i][j]=0; } } } return max_area; } };