单调栈\(O(n^2)\)解法
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if (matrix.size() == 0) return 0;
if (matrix[0].size() == 0) return 0;
int n = matrix.size();
int m = matrix[0].size();
vector<vector<int>> dp(n, vector<int>(m + 1));
vector<int> L(m + 1);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
dp[i][j] = matrix[i][j] == '1';
if (i > 0 && matrix[i][j] == '1' && matrix[i - 1][j] == '1')
dp[i][j] += dp[i - 1][j];
}
dp[i][m] = -1;
}
int ans = 0;
for (int i = 0; i < n; ++i) {
stack<int> stk;
for (int j = 0; j <= m; ++j) {
L[j] = j;
while (!stk.empty() && dp[i][j] <= dp[i][stk.top()]) {
L[j] = L[stk.top()];
ans = max(ans, (j - L[stk.top()]) * dp[i][stk.top()]);
stk.pop();
}
stk.push(j);
}
}
return ans;
}
};