class Solution {
public:
int maximalRectangle(vector<vector<char> > &matrix) {
int m=matrix.size();
if(m==0)
return 0;
int n=matrix[0].size();
if(n==0)
return 0;
vector<vector<int>> dp(m,vector<int>(n,0));
for(int i=0;i<m;i++)
{
dp[i][0]=(matrix[i][0]=='1'?1:0);
}
for(int i=0;i<m;i++)
{
for(int j=1;j<n;j++)
{
dp[i][j]=(matrix[i][j]=='1'?dp[i][j-1]+1:0);
}
}
int area=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
int k=i;
int height=INT_MAX;//height控制以i,j为右下角的矩形的高度。
while(k>=0)
{
if(dp[k][j]==0)
break;
height=min(height,dp[k][j]);
area=max(area,height*(i-k+1));
k--;
}
}
}
return area;
}
};
public:
int maximalRectangle(vector<vector<char> > &matrix) {
int m=matrix.size();
if(m==0)
return 0;
int n=matrix[0].size();
if(n==0)
return 0;
vector<vector<int>> dp(m,vector<int>(n,0));
for(int i=0;i<m;i++)
{
dp[i][0]=(matrix[i][0]=='1'?1:0);
}
for(int i=0;i<m;i++)
{
for(int j=1;j<n;j++)
{
dp[i][j]=(matrix[i][j]=='1'?dp[i][j-1]+1:0);
}
}
int area=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
int k=i;
int height=INT_MAX;//height控制以i,j为右下角的矩形的高度。
while(k>=0)
{
if(dp[k][j]==0)
break;
height=min(height,dp[k][j]);
area=max(area,height*(i-k+1));
k--;
}
}
}
return area;
}
};