洛谷p4147 (最大子矩陣)
阿新 • • 發佈:2018-12-14
#include<iostream> using namespace std; int hh[1010][1010],s[1010],l[1010]; char map[1010][1010]; int n,m,ans=0; void solve(int h[]){ int top=0,len=0; s[top]=0;l[top]=0; for(int i=1;i<=m;i++){ if(h[i]>s[top]){ s[++top]=h[i]; l[top]=1; } else{ len=0; while(top&&s[top]>h[i]){ len+=l[top];//把前面比這個高的單獨算 ans=max(ans,len*s[top]); top--; } s[++top]=h[i]; l[top]=len+1;//相當於求前面不超過當前高度的面積並 } } len=0; while(top){ len+=l[top]; ans=max(ans,len*s[top]); top--; } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>map[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(map[i][j]=='F') hh[i][j]=hh[i-1][j]+1; } } for(int i=1;i<=n;i++) solve(hh[i]); cout<<3*ans<<endl; }