洛谷P4147
P4147 玉蟾宫
本书对于该题的讲解挺好懂的,悬线的思想真挺妙的
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
vector<vector<char>> a(N, vector<char>(N));//土地归属
vector<vector<int>> h(N, vector<int>(N));//每块土地所拥有的悬线长度
vector<vector<int>> l(N, vector<int>(N));//同行内左障碍边界
vector<vector<int>> r(N, vector<int>(N));//同行内右障碍边界
int main() {
int n, m; cin >> n >> m;
long long ans = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
h[i][j] = 1, r[i][j] = l[i][j] = j;//初始化后每块土地各自独立
}
for(int j = 2; j <= m; j++) {
if(a[i][j] == 'F' && a[i][j - 1] == 'F') l[i][j] = l[i][j - 1];//a[i][j]和a[i][j - 1]是连通的,所以共享同一左边界
}
for(int j = m - 1; j > 0; j--) {
if(a[i][j] == 'F' && a[i][j + 1] == 'F') r[i][j] = r[i][j + 1];//a[i][j]和a[i][j + 1]是连通的,所以共享同一右边界
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(i > 1 && a[i][j] == 'F') {
if(a[i - 1][j] == 'F') {
h[i][j] = h[i - 1][j] + 1;//上方方块非障碍,悬线长度+1
if(l[i - 1][j] > l[i][j]) l[i][j] = l[i - 1][j];
if(r[i - 1][j] < r[i][j]) r[i][j] = r[i - 1][j];
//这里对应书里解释是计算悬线可以往左或者往右的最远地方,这里是相对难以理解的
}
if((r[i][j] - l[i][j] + 1) * h[i][j] > ans) ans = (r[i][j] - l[i][j] + 1) * h[i][j];
}
}
}
cout << 3 * ans;
return 0;
}

浙公网安备 33010602011771号