题目大意:第一行n, m表示矩形土地有n行m列。接下来输入土地,由F和R组成,问最大的F矩形土地的面积,答案乘以3
将F置为1,R置为0,相当于求最大1矩阵的面积
l[i][j]表示从坐标(i, j)最左边到达0的位置
r[i][j]表示从坐标(i, j)最右边到达0的位置
h[i][j]表示从坐标(i, j)向上扩展的最大高度
则面积表达式:(r[i][j] - l[i][j] - 1) * h[i][j];
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
const int maxn = 1010;
int n, m;
int a[maxn][maxn];//地图,F为1,R为0
int l[maxn][maxn], r[maxn][maxn];//该坐标最左(右)边到达0的位置
int h[maxn][maxn];//该位置向上能扩展的最大高度
int ans;
void solve()
{
//初始化
int i, j;
ans = 0;
for(i = 0; i <= m; ++i)
{
h[0][i] = 0;
l[0][i] = 0;
r[0][i] = m + 1;
}
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= m; ++j) h[i][j] = a[i][j]?h[i - 1][j]+1:0;
int tmp = 0;//初始认为向左初次达到不是x的位置是0
for(j = 1; j <= m; ++j)
if(a[i][j]) l[i][j] = max(l[i - 1][j], tmp);
else l[i][j] = 0, tmp = j;//将l[i][j]=0使其不对下一行产生影响
tmp = m + 1;//初始认为向右初次达到不是x的位置是m+1
for(j = m; j; --j)
if(a[i][j]) r[i][j] = min(r[i - 1][j], tmp);
else r[i][j] = m + 1, tmp = j;
for(j = 1; j <= m; ++j)
{
int ret = (r[i][j] - l[i][j] - 1) * h[i][j];
ans = max(ans, ret);
}
}
}
int main()
{
int i, j;
char ch;
memset(a, 0, sizeof(a));
scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i)
for(j = 1; j <= m; ++j)
{
cin >> ch;
if(ch == 'F') a[i][j] = 1;
}
solve();
printf("%d\n", ans * 3);
return 0;
}