0%

P4147 玉蟾宫

P4147.玉蟾宫

题目描述:

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

题目描述

这片土地被分成 $N\times M$ 个格子,每个格子里写着 ‘R’ 或者 ‘F’,R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。

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

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

输入格式

第一行两个整数 $N,M$ ,表示矩形土地有 $N\times M$ 列。

接下来 $N$ 行,每行 $M$ 个用空格隔开的字符 ‘F’ 或 ‘R’,描述了矩形土地。

输出格式

输出一个整数,表示你能得到多少银子,即 ( $3\times S$ ) 的值。

数据范围:

$1\le N,M\le 1000$

题解:

略,注意更新高度的时候,从 $i-1$ 更新过来。

代码:

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
using namespace std;
using namespace FAST_IO;
const ll mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const ll INF_LL = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-5;
const int maxn = 1e3 + 10;
const int maxm = 1e5 + 10;
int t, n, m, k;
int matrix[maxn][maxn];
int l[maxn][maxn], r[maxn][maxn];
int h[maxn][maxn];
void solve()
{
int ans = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
if (matrix[i][j] == 1)
l[i][j] = l[i][j - 1] + 1;
}
for (int j = m; j >= 1; --j)
{
if (matrix[i][j] == 1)
r[i][j] = r[i][j + 1] + 1;
}
for (int j = 1; j <= m; ++j)
{
h[i][j] = matrix[i][j];
if (i >= 2 && matrix[i - 1][j] == 1)
{
l[i][j] = min(l[i][j], l[i - 1][j]);
r[i][j] = min(r[i][j], r[i - 1][j]);
h[i][j] = h[i - 1][j] + 1;
}
ans = max(ans, (l[i][j] + r[i][j] - 1) * h[i][j]);
}
}
cout << 3 * ans << endl;
}
int main()
{
// #define COMP_DATA
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
char ch;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cin >> ch;
matrix[i][j] = (ch == 'F');
}
}
solve();
return 0;
}