题目地址


注意点:

  • 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]);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#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;
}