#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
int d[maxn][maxn];
int l[maxn],r[maxn];
int t,a,b;
char c[2];
int maxs;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
memset(d,0,sizeof(d));
maxs=0;
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
scanf("%s",c);
if(c[0]=='F')
d[i][j]=1;
}
}
/* for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
printf("%d ",d[i][j]);
printf("\n");
}*/
for(int i=1;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(d[i][j]!=0)
d[i][j]=d[i-1][j]+1;
}
}
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
l[j]=j;
while(l[j]>0&&d[i][l[j]-1]>=d[i][j]) l[j]=l[l[j]-1];
}
for(int j=b-1;j>-1;j--)
{
r[j]=j;
while(r[j]<b-1&&d[i][r[j]+1]>=d[i][j]) r[j]=r[r[j]+1];
}
for(int j=0;j<b;j++)
{
if(maxs<((r[j]-l[j]+1)*d[i][j])) maxs=(r[j]-l[j]+1)*d[i][j];
}
}
printf("%d\n",maxs*3);
}
return 0;
}
这个其实不是什么常见的DP问题了,这个是在求最大高度的左右边的时候也用了一个状态转移函数。
l[j]=l[l[j]-1];
r[j]=r[r[j]-1];
这个比较的难想到,其实这个题目的解题方法本身就是比较新颖的,一开始不一定可以想的到啊。
这个题目还需要注意的是要记得每次算完了一层i的l和r后要做一次求maxs。
然后在一开始读取数据的时候要记得小心,这种题目经常会在这里翻车,用scanf("%c",&c);加上各种getchar();这种读法的时候还是会WA的啊,这让人还是很郁闷的。