最大红矩形(单调栈)
每行求一次最大子矩形
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 }

浙公网安备 33010602011771号