题意:这道题是1506的加强版,实际上1506就是它的一个子问题,给你一张地图,上面有的区域被占据了,由P来表示,有的区域是空的,由F来表示,叫你找一个最大的矩形,矩形内要求全是空的地,答案就是最大的矩形的面积乘上3,输出就可以了
思路:就是枚举,将第i行选作矩形的底,再算出每块地的上方由多少个空地,然后就便成了1506的问题了,如果不会的话可以看下我hdu 1506 的题解,求出所有的答案,最大值就是答案。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int high[1010][1010];
int l[1010],r[1010];
int main()
{
int cas;
cin>>cas;
while(cas--){
char c[10];
memset(high,0,sizeof(high));
int n,m;
cin>>n>>m;
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%s",&c);
if(c[0]=='F')
high[i][j]=high[i-1][j]+1;
else high[i][j]=0;
}
}
for(int i=1;i<=n;i++){
l[1]=0;r[m]=m+1;
for(int j=2;j<=m;j++){
int x=j-1;
while(x&&high[i][j]<=high[i][x])
x=l[x];
l[j]=x;
}
for(int j=m-1;j>0;j--){
int x=j+1;
while(x<=m&&high[i][j]<=high[i][x])
x=r[x];
r[j]=x;
}
for(int j=1;j<=m;j++)
ans=max(ans,high[i][j]*(r[j]-l[j]-1));
}
cout<<ans*3<<endl;
}
return 0;
}