Return 4.
一开始想用贪心,但是总觉得想的不太顺,后来用DP。
每个点的dp值为以该点为右下角做能构成的矩阵最大值。这里的最大值不是面积而是边长。
需要注意的是第一遍敲的时候,第一,忘记先把两个边界填充好,第二,忘记在填充边界的时候更新maxs,第三,忘记填充过后的循环应该从1开始,第四,忘记返回的是maxs的平方。
少年仍需努力啊。
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { if(!matrix.size()) return 0; vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size(), 0)); int maxs = 0; for(int i = 0; i < matrix.size(); ++i) {dp[i][0] = matrix[i][0]-'0'; maxs = max(maxs, dp[i][0]);} for(int j = 0; j < matrix[0].size(); ++j) {dp[0][j] = matrix[0][j]-'0'; maxs = max(maxs, dp[0][j]);} for(int i = 1; i < dp.size(); ++i) for(int j = 1; j < dp[0].size(); ++j){ if(matrix[i][j]-'0' == 1){ if(dp[i-1][j-1]&&dp[i-1][j]&&dp[i][j-1]) { dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))+1; maxs = max(maxs, dp[i][j]); } else dp[i][j] = 1; } } return maxs*maxs; } };