题目描述
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4
解题思路
分享一下动态规划状态定义的小套路(纯属个人见解,不一定正确),如果使用一维数组,dp[i]通常定义为以i结尾或前i位的XXX;如果设计二维数组dp[i][j]通常定义为第i行第j列的XXX。这里的XXX表示原问题,或则是可以求出原问题的隐含问题。比如本题是求最大正方形面积,当时直接定义dp[i][j]表示到以matrix[i][j]为右下角的最大正方形面积会使得状态转换方程很难设计,于是可以往下下一步,正方形最大面积等于最大边长的平方,于是可以考虑定义dp[i][j]表示matrix[i][j]为右下角的最大边长。
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.size() == 0 || matrix[0].size()==0) return 0;
int m = matrix.size(),n = matrix[0].size();
int dp[m+1][n+1],maxe = 0;
memset(dp,0,sizeof(dp));
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-1][j],dp[i][j-1])) + 1;
maxe = max(maxe,dp[i][j]);
}
}
}
return maxe*maxe;
}