玉蟾宫题解
题目背景
有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
题目描述
这片土地被分成 N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。
现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 'F' 并且面积最大。
但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 S,它们每人给你 S 两银子。
输入格式
第一行两个整数 N,M,表示矩形土地有 N 行 M 列。
接下来 N 行,每行 M 个用空格隔开的字符 'F' 或 'R',描述了矩形土地。
输出格式
输出一个整数,表示你能得到多少银子,即 (3×最大 ’F’ 矩形土地面积) 的值。
输入输出样例
输入 #1复制
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
输出 #1复制
45
说明/提示
对于 50% 的数据,1≤N,M≤200。
对于 100% 的数据,1≤N,M≤1000。
思路
悬线法。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,m,f[1005][1005],l[1005][1005],r[1005][1005],h[1005][1005],l2[1005][1005],r2[1005][1005],op=0;
char ch[1005][1005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>ch[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ch[i][j]=='F') l[i][j]=l[i][j-1]+1;
else l[i][j]=0;
}
}
for(int i=0;i<=n;i++){
for(int j=1;j<=m;j++){
l2[i][j]=r2[i][j]=1e9+7;
}
}
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
if(ch[i][j]=='F') r[i][j]=r[i][j+1]+1;
else r[i][j]=0;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ch[i][j]=='F'){
h[i][j]=h[i-1][j]+1;
l2[i][j]=min(l2[i-1][j],l[i][j]-1);
r2[i][j]=min(r2[i-1][j],r[i][j]-1);
//cout<<i<<" "<<j<<" "<<l2[i][j]<<" "<<r2[i][j]<<endl;
op=max(op,(l2[i][j]+r2[i][j]+1)*(h[i][j]));
}
}
}
cout<<op*3<<endl;
return 0;
}

浙公网安备 33010602011771号