预处理每个点向左向右向上延伸的最长距离即可
实现上注意矩形的约束条件,也就是取min的过程
#include#include using namespace std;const int MAXN = 1005;int n,m;int a[MAXN][MAXN];int h[MAXN][MAXN],l[MAXN][MAXN],r[MAXN][MAXN];int main(){ cin>>n>>m; char c; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>c; if(c=='F')a[i][j]=1; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(!a[i][j])continue; h[i][j]=1;l[i][j]=1; if(a[i-1][j])h[i][j]+=h[i-1][j]; if(a[i][j-1])l[i][j]+=l[i][j-1]; } for(int j=m;j>=1;j--){ if(!a[i][j])continue; r[i][j]=1; if(a[i][j+1])r[i][j]+=r[i][j+1]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(h[i][j]<=1)continue; l[i][j]=min(l[i][j],l[i-1][j]); r[i][j]=min(r[i][j],r[i-1][j]); } } int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ans=max(ans,h[i][j]*(r[i][j]+l[i][j]-1)); } } cout<<3*ans; return 0;}