题目描述:
在一个由0和1组成的矩阵内,找到只包含1的最大正方形的最大面积。
题解:
考虑动态规划。用$dp(i,j)$表示以$(i,j)$为右下角,且只包含1的正方形的边长的最大值。状态可以参考(leetcode 1277),如下:
- 如果当前位置为0,$dp(i,j) = 0$
- 如果当前位置为1,当前状态由其左方、上方、左上方共同决定:$dp(i,j) = min(dp(i,j-1) , dp(i-1,j),dp(i-1,j-1)) + 1$
下图给出了dp的计算过程:
AC代码如下:
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) { return 0; } int maxSide = 0; int rows = matrix.size(), columns = matrix[0].size(); vector<vector<int>> dp(rows, vector<int>(columns)); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { if (matrix[i][j] == '1') { if (i == 0 || j == 0) { dp[i][j] = 1; } else { dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; } maxSide = max(maxSide, dp[i][j]); } } } int maxSquare = maxSide * maxSide; return maxSquare; } };