class Solution { public: int maximalRectangle(vector<vector<char>>& matrix) { if(matrix.empty()) return 0; int m=matrix.size(), n=matrix[0].size(); vector<vector<int>> dp(m, vector<int>(n, 0)); for(int i=0; i<m; ++i){ for(int j=n-1; j>=0; --j){ if(j==n-1) dp[i][j] = matrix[i][j]=='1'; else dp[i][j] = matrix[i][j]=='1' ? dp[i][j+1]+1 : 0; } } int maxarea=0; for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ int k=i; int minw=dp[k][j]; for(;k<m && matrix[k][j]!='0'; ++k){ minw = min(minw, dp[k][j]); maxarea = max(maxarea, minw*(k-i+1)); } } } return maxarea; } };