P4147 玉蟾宫

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4147 玉蟾宫相关的知识,希望对你有一定的参考价值。

P4147 玉蟾宫

题意:

给你一个n * m的矩阵,矩阵每个值有F或R,求最大的全为F的矩阵,输出面积 * 3

题解:

很明显,求最大01矩阵,悬线法或者单调栈
对于模板除了要记熟还要知道原理,不能光搬运,还要会调整

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){
   ll s=0,w=1ll;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
const int maxn=2000;
int a[maxn][maxn];
int up[maxn][maxn];
int Left[maxn][maxn];
int Right[maxn][maxn];
inline int R(){
	char ch=getchar();
	while(ch!='F'&&ch!='R'){
		ch=getchar();
	}
	if(ch=='F')return 1;
	return 0;
}
inline int max(int x,int y){
	return x>y?x:y;
}
inline int min(int x,int y){
	return x<y?x:y;
}
int main()
{
	int n,m;
	cin>>n>>m;
	char ch=getchar();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			a[i][j]=R();
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j])up[i][j]=1;
			else up[i][j]=0;
			Left[i][j]=Right[i][j]=j;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=2;j<=m;j++){
			if(a[i][j]==1&&a[i][j-1]==1)
				Left[i][j]=Left[i][j-1];
		}
		for(int j=m-1;j>=1;j--){
			if(a[i][j]==1&&a[i][j+1]==1)
				Right[i][j]=Right[i][j+1];
		}
	}
	int maxx=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]&&a[i-1][j]&&i>1){
				up[i][j]=up[i-1][j]+1;
				Left[i][j]=max(Left[i][j],Left[i-1][j]);
				Right[i][j]=min(Right[i][j],Right[i-1][j]);
			}
			maxx=max(maxx,(Right[i][j]-Left[i][j]+1)*up[i][j]);
		}
	}
	cout<<maxx*3;
	return 0;
}


以上是关于P4147 玉蟾宫的主要内容,如果未能解决你的问题,请参考以下文章

[Luogu P4147] 玉蟾宫 (网格DP)

2491 玉蟾宫

[BZOJ3039]玉蟾宫

codevs 2491 玉蟾宫

Codevs 2491 玉蟾宫

codevs 2491 玉蟾宫