和HDU1506同理
注意读入是列连续的为f时的处理,a[i]通过自增的方法来遇到r的时候变0的方法来保存连续的状态。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
int a[1010],maxx;
char s[3000];
int x,y;
void dp(){
int l[1010],r[1010];
for(int i=1;i<=x;i++)
r[i]=l[i]=i;
for(int i=1;i<=x;i++){
while(a[l[i]-1]>=a[i])
l[i]=l[l[i]-1];
}
for(int i=x;i>0;i--){
while(a[r[i]+1]>=a[i])
r[i]=r[r[i]+1];
}
for(int i=1;i<=x;++i){
maxx=max(maxx,(r[i]-l[i]+1)*a[i]);
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
while(n--){
scanf("%d %d",&y,&x);
memset(a,0,sizeof(a));
a[0]=a[x+1]=-1;
maxx=0;
for(int i=1;i<=y;i++){
for(int j=1;j<=x;j++){
scanf("%s",s);
s[0]=='F'?a[j]++:a[j]=0;
}
dp();
}
cout<<maxx*3<<endl;
}
}
}