注意点:
- if(canGet[x][y-1])l[x][y]=max(l[x][y],l[x][y-1]);
- if(canGet[x][y-1])r[x][y]=min(r[x][y],r[x][y-1]);
#include<cstdio> #include<iostream> using namespace std; const int MAXN=2e3,INF=2e9; bool canGet[MAXN][MAXN];//可获取 int l[MAXN][MAXN],r[MAXN][MAXN]; int h[MAXN][MAXN]; int maxY,maxX; int main(){ scanf("%d%d",&maxY,&maxX); for(int y=1;y<=maxY;y++){ for(int x=1;x<=maxX;x++){ char tmp; cin>>tmp; if(tmp=='F')canGet[x][y]=1; else canGet[x][y]=0; } } for(int x=1;x<=maxX;x++){ for(int y=1;y<=maxY;y++){ l[x][y]=r[x][y]=x; } } for(int y=1;y<=maxY;y++){ for(int x=1;x<=maxX;x++){ if(!canGet[x][y])continue; if(canGet[x-1][y])l[x][y]=l[x-1][y]; else l[x][y]=x; } for(int x=maxX;x>=1;x--){ if(!canGet[x][y])continue; if(canGet[x+1][y])r[x][y]=r[x+1][y]; else r[x][y]=x; } } for(int x=1;x<=maxX;x++) r[x][0]=INF; int ans=0; for(int y=1;y<=maxY;y++){ for(int x=1;x<=maxX;x++){ if(canGet[x][y]){ h[x][y]=h[x][y-1]+1; if(canGet[x][y-1])l[x][y]=max(l[x][y],l[x][y-1]); if(canGet[x][y-1])r[x][y]=min(r[x][y],r[x][y-1]); ans=max(ans,(r[x][y]-l[x][y]+1)*h[x][y]); } } } cout<<ans*3<<endl; return 0; }