题目大意:给定一个m×n的矩阵,F代表空地,R代表障碍,让你找出最大的一个没有障碍的矩形阵地,输出矩阵的面积×3
解题思路:每一个格子我们都当底,可以计算出他之上有的空地有多高,再遍历一次,用当前块的高度扫描左右,只要左右的高度比这个高即可,可以求出宽度,维护最大的面积即可。维护高度的时候有个小技巧,不需要遍历,只需看它上面一个是不是空地,如果是,当前的就是上面那个高度+1
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int mp[1050][1050];
int main()
{
int K, m, n;
char ch;
scanf("%d", &K);
while(K--)
{
scanf("%d%d", &m, &n);
int maxs = 0;
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
ch = getchar();
while(ch != 'F' && ch != 'R') ch = getchar();
if(ch == 'F' && i > 0 && mp[i-1][j]) mp[i][j] = mp[i-1][j]+1;
else if(ch == 'F') mp[i][j] = 1;
else mp[i][j] = 0;
}
for(int j=0; j<n; j++) //扫描
{
if(mp[i][j] == 0) continue;
int x = j;
do{
x--;
}while(x >= 0 && mp[i][x] >= mp[i][j]); //向左扫描
int w = j-x;
x = j;
do{
x++;
}while(x<n && mp[i][x] >= mp[i][j]);//向右扫描
w += x-j-1;
w *= mp[i][j];
maxs = max(maxs, w);
}
}
printf("%d\n", maxs*3);
}
return 0;
}