/*
将每一行向上的方向的1的个数作为高就变成了求矩形的最大面积
*/
class Solution {
public:
int f(int i,int m,vector<vector<int>> & g)
{
stack<int> st;
st.push(-1);
int ans=0;
for(int j=0;j<m;j++)
{
while(st.top() != -1 && g[i][j] < g[i][st.top()])
{
int k=st.top();st.pop();
ans=max(ans,g[i][k]*(j-1-st.top()));
}
st.push(j);
}
while(st.top() != -1)
{
int k=st.top();st.pop();
ans=max(ans,g[i][k]*(m-1-st.top()));
}
return ans;
}
int maximalRectangle(vector<vector<char>>& matrix) {
int n=matrix.size();
if(!n) return 0;
int m=matrix[0].size();
vector<vector<int>> g(n+10,vector<int>(m+10));
for(int i=0;i<m;i++) if(matrix[0][i] == '1') g[0][i]=1;
for(int i=1;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(matrix[i][j] == '1') g[i][j]=g[i-1][j]+1;
}
}
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<m;j++)
// {
// cout<<g[i][j]<<" ";
// }
// cout<<endl;
// }
int ans=0;
for(int i=0;i<n;i++)
ans=max(ans,f(i,m,g));
return ans;
}
};