Problem
Solution
题意为给定一个二维数组,其中元素都有0和1组成,找到最大的正方形(其中元素都为1)算出其面积
定义二维数组dp,其中dp[i][j]的含义是,以(i,j)这个位置为右下角的正方形边长
那么考虑dp[i][j]怎么求
dp[i-1][j-1]代表以(i-1,j-1)为右下角的最大正方形边长
那么若要把(i,j)接在(i-1,j-1)之后组成一个更大的正方形
首先(i,j)这个位置必须是元素1
其次(i,j)要能和(i-1,j-1)组成新正方形,那么要考虑这个新正方形的下边和右边的长度是否够长
那么dp[i][j]就是要取dp[i-1][j-1] dp[i-1][j] dp[i][j-1]中的最小值再加上1(因为(i,j)这个位置本身就占一个长度)
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
size_t n=matrix.size(),m=matrix[0].size();
vector<vector<int>> dp(n,vector<int>(m,0));
int ans=0;
for(size_t i=0;i<n;++i){
for(size_t j=0;j<m;++j){
if(matrix[i][j]=='1') dp[i][j]=1;
if(i>=1&&j>=1&&matrix[i][j]=='1'){
dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
}
ans=ans>dp[i][j]?ans:dp[i][j];
}
}
return ans*ans;
}
};