AcWing 152. 城市游戏
宋标 Lv5

题目

有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。

这片土地被分成 个格子,每个格子里写着 R 或者 FR 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。

现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 F 并且面积最大。

但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 ,它们将给你 两银子。

输入格式

第一行包括两个整数 ,表示矩形土地有 列。

接下来 行,每行 个用空格隔开的字符 FR,描述了矩形土地。

每行末尾没有多余空格。

输出格式

输出一个整数,表示你能得到多少银子,即(最大 F 矩形土地面积)的值。

数据范围

输入样例:

5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F

输出样例:

45

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1010;

int h[N][N], l[N], r[N], q[N];
char g[N][N];
int n, m;

// 求出每行的左边界和右边界
int work(int a[])
{
a[0] = a[m + 1] = -1;
int tt = 0;
q[0] = 0;
for (int i = 1; i <= m; ++ i)
{
while (a[q[tt]] >= a[i]) -- tt;
l[i] = q[tt];
q[++ tt] = i;
}

tt = 0;
q[0] = m + 1;
for (int i = m; i; -- i)
{
while (a[q[tt]] >= a[i]) -- tt;
r[i] = q[tt];
q[++ tt] = i;
}

int res = 0;
for (int i = 1; i <= m; ++ i)
res = max(res, (r[i] - l[i] - 1) * a[i]);

return res;
}

int main()
{
cin >> n >> m;

// 求出每行F的高度个数,这题将看成多行的131题.直方图
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
{
char c;
cin >> c;
g[i][j] = c;
if (c == 'F') h[i][j] = h[i - 1][j] + 1;
else h[i][j] = 0;
}

int res = 0;

for (int i = 1; i <= n; ++ i)
res = max(res, work(h[i]));

cout << res * 3 << endl;

return 0;
}
 评论