思路:有点类似于之前做过的最大正方形面积,维护l[i][j]维护以(i,j)为末尾的横向1的长度,r[i][j]维护i,j结尾的纵向1的长度。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int n=matrix.size();
if(n==0) return 0;
int m=matrix[0].size();
int l[n+2][m+2],r[n+2][m+2];
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(matrix[i][j]=='0') continue;
if(i==0&&j==0){
l[i][j]=1;
r[i][j]=1;
ans=1;
}
else if(i==0){
l[i][j]=l[i][j-1]+1;
r[i][j]=1;
ans=max(ans,l[i][j]);
}
else if(j==0){
l[i][j]=1;
r[i][j]=r[i-1][j]+1;
ans=max(ans,r[i][j]);
}
else{
l[i][j]=l[i][j-1]+1;
r[i][j]=r[i-1][j]+1;
int h=r[i][j];
for(int k=j;k>=j-l[i][j]+1;k--){
h=min(h,r[i][k]);
ans=max(ans,h*(j-k+1));
}
}
}
}
return ans;
}
};