最大红矩形(单调栈)

每行求一次最大子矩形

 1 #include<iostream>
 2 #include<stack>
 3 #include<cstdio>
 4 using namespace std;
 5 char a[2000][2000];
 6 int height[60000];
 7 int solve(int n,int m)
 8 {
 9     int ans=0;
10     for(int k=0;k<n;k++){
11         for(int i=1;i<=m;i++){
12             if(a[k][i-1]=='.'){
13                  height[i]++;
14             }
15             else{
16                 height[i]=0;
17             }
18         }
19         stack<int>mystack;
20         mystack.push(0);
21         for(int i=1;i<=m+1;i++){
22             while(height[mystack.top()]>height[i])
23             {
24                 int nowheight=height[mystack.top()];
25                 mystack.pop();
26                 ans=max(ans,nowheight*(i-mystack.top()-1));
27             }
28             mystack.push(i);
29         }
30     }
31     return ans;
32 }
33 int main()
34 {
35     int n,m;
36     cin>>n>>m;
37     for(int i=0;i<n;i++){
38         cin>>a[i];
39     }
40     cout<<solve(n,m)<<endl;
41     return 0;
42 }

 

posted @ 2018-03-31 15:25  ghblw  阅读(178)  评论(0)    收藏  举报