刘汝佳厚书例题:扫描法。
思路:
对行枚举,对于任意行i, 用up[j]来记录a[i][j]上方有多少个空闲的格子,lf[j]来记录up[j]的规模可以左移到多少行,同理,rg[j]来记录右移。
则最后的高度为up[j]的子矩阵的面积为:s = up[j]*(rg[j]-lf[j]+1);
注意:
读入的时候最好用最保险的读入方式,不要相信题目中所谓的 怎么换行怎么空格 的格式。
代码如下:
int n, m, up[M], lf[M],rg[M];
bool a[M][M];
int main()
{
int t;
char x;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
getchar();
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
scanf("%c", &x);
while(x!='F'&&x!='R') scanf("%c", &x);
a[i][j] = (x=='F'?false:true);
}
memset(up,0,sizeof(up));
int ans = 0;
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= m; ++j)
{
if(a[i][j]) up[j] = 0;
else up[j] += 1;
}
for(int j = 1; j <= m; ++j)
{
if(up[j]==0) continue;
int r = j, l = j;
while(up[r]>=up[j]&&r<=m) ++r;
while(up[r]>=up[j]&&l>=1) --l;
if(up[r]<up[j]) --r;
if(up[l]<up[j]) ++l;
ans = max(ans, (r-l+1)*up[j]);
}
}
printf("%d\n", ans*3);
}
return 0;
}