玉蟾宫题解

题目背景

有一天,小猫 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;
}

posted @ 2025-10-14 21:17  bz02_2023f2  阅读(9)  评论(0)    收藏  举报  来源