/*扫描法
LA 3029 - City Game
求由F字母组成的最大的矩形,扫描 从上到下 ,从左到右。
分别求出每个格子向上,向左,向右衍生的极限,面积就有这几部分组成,求出最大的面积*3就是答案
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn=1000;
int mat[maxn][maxn],up[maxn][maxn],right1[maxn][maxn],left1[maxn][maxn];
int max(int x,int y)
{
if(x>y) return x;
return y;
}
int min(int x,int y)
{
if(x<y) return x;
return y;
}
int main()
{
int t;
int i,j;
int m,n,lo,ro;
char ch;
int ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
// char ch=getchar();
cin>>ch;
//while(ch!='F' && ch!='R')
// ch=getchar();
if(ch=='F')
mat[i][j]=0;
else
mat[i][j]=1;
} //转化成由 0构成的矩形
ans=0;
for(i=0;i<m;i++)
{
lo=-1;
ro=n;
for(j=0;j<n;j++)
{
if(mat[i][j]==1)
{
up[i][j]=0;
left1[i][j]=0;
lo=j;
}
else
{
up[i][j]=(i==0?1:up[i-1][j]+1);
left1[i][j]=(i==0?lo+1:max(lo+1,left1[i-1][j]));
}
}
// ans=0;
for(j=n-1;j>=0;j--)
{
if(mat[i][j]==1)
{
right1[i][j]=n;
ro=j;
}
else
{
right1[i][j]=i==0?ro-1:min(right1[i-1][j],ro-1);
ans=max(ans,up[i][j]*(right1[i][j]-left1[i][j]+1));
}
}
}
printf("%d\n",3*ans);
}
return 0;
}
LA 3029 - City Game
最新推荐文章于 2021-03-03 12:55:30 发布