1. 程式人生 > 其它 >洛谷P4147 玉蟾宮 (單調棧)

洛谷P4147 玉蟾宮 (單調棧)

要求我們去找一個最大矩形面積。

單調棧做法(和P1950 長方形那道題類似(一模一樣))。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char M[1010][1010];
 4 int n,m,h[1010],l[1010],r[1010];
 5 int s[1010],top;
 6 
 7 void ddzl(){
 8     top=0;
 9     for(int i=m;i>=1;i--){
10         while(top!=0 && h[i]<h[s[top]]) l[s[top--]]=i;
11 s[++top]=i; 12 } 13 while(top) l[s[top--]]=0; 14 } 15 16 void ddzr(){ 17 top=0; 18 for(int i=1;i<=m;i++){ 19 while(top!=0 && h[i]<h[s[top]]) r[s[top--]]=i; 20 s[++top]=i; 21 } 22 while(top) r[s[top--]]=m+1; 23 } 24 int ans=0; 25 void work(){
26 ddzl();ddzr(); 27 for(int i=1;i<=m;i++) 28 ans=max(ans,h[i]*(r[i]-l[i]-1)); 29 } 30 31 int main(){ 32 scanf("%d%d",&n,&m); 33 for(int i=1;i<=n;i++) 34 for(int j=1;j<=m;j++) 35 cin>>M[i][j]; 36 for(int i=1;i<=n;i++){ 37 for
(int j=1;j<=m;j++){ 38 if(M[i][j]=='F') h[j]++; 39 else h[j]=0; 40 } 41 work(); 42 } 43 cout<<3*ans; 44 }

俗話說得好啊,題做多了總有重複的,模型記住了,其他類似的題也就能解決了。。。