求助
  • 板块题目总版
  • 楼主LSc_666
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/3/19 14:46
  • 上次更新2023/10/23 21:07:14
查看原帖
求助
957595
LSc_666楼主2023/3/19 14:46

玉蟾宫

题目背景

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

题目描述

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

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

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

输入格式

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

接下来 NN 行,每行 MM 个用空格隔开的字符 'F' 或 'R',描述了矩形土地。

输出格式

输出一个整数,表示你能得到多少银子,即 (3×最大 ’F’ 矩形土地面积3\times \text{最大 'F' 矩形土地面积}) 的值。

样例 #1

样例输入 #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%50\% 的数据,1N,M2001 \leq N, M \leq 200
对于 100%100\% 的数据,1N,M10001 \leq N, M \leq 1000


我的代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline int Read(){
	int x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();};
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*f;
}//读入优化 
inline int Readc(){
	char c=getchar();
	while(c!='R'&&c!='F')c=getchar();
	if(c=='F')return 1;
	return 0;
}//F能用,E不能用 
inline int max(int x,int y){
	return x>y?x:y;
}
inline int min(int x,int y){
	return x<y?x:y;
}
//max和min最好自己打
int n,m,ans1,ans,map[1001][1001];;
//ans:最大矩形;map[i][j]:(i,j)的值 ,0不能用,1可以用 
int l[2018][2018],r[2018][2018];
//l[i][j],r[i][j],up[i][j]分别表示(i,j)左,右能到达的最远的点的纵坐标
int up[2018][2018];
//向上到达最远的点的距离 
int main(){
	register int i,j;
	ans=0;
	n=Read(),m=Read();
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			map[i][j]=Readc(),up[i][j]=1,r[i][j]=l[i][j]=j;
	//处理l 
	for(i=1;i<=n;i++)
		for(j=2;j<=m;j++)
			if(map[i][j]==1&&map[i][j-1]==1) 
			l[i][j]=l[i][j-1];
	//处理r
	for(i=1;i<=n;i++)
		for(j=m-1;j>0;j--)
			if(map[i][j]==1&&map[i][j+1]==1)
			r[i][j]=r[i][j+1];
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
		if(i>1&&map[i][j]==1&&map[i-1][j]==1){
			r[i][j]=min(r[i][j],r[i-1][j]);
			l[i][j]=max(l[i][j],l[i-1][j]);
			up[i][j]=up[i-1][j]+1;
		}
		ans=max(ans,(r[i][j]-l[i][j]+1)*up[i][j]);
		}
	}
	printf("%d",3*ans);
	return 0;
}

不知为何90分

2023/3/19 14:46
加载中...