Luogu4147 玉蟾宫
Posted pushinl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu4147 玉蟾宫相关的知识,希望对你有一定的参考价值。
正解貌似是单调栈??然而我看起来这是个裸的最大子矩形啊qwq
于是用了DP
设(h(i,j))表示以((i,j))为下端点的悬线的最长长度。
预处理(l(i,j))和(r(i,j)),它们分别表示点((i,j))能扩展到的左边和右边的最近的障碍。
(L(i,j))和(R(i,j))分别表示使悬线有此长度的左边最近的障碍和右边最近的障碍。
答案即为(max(h(i,j)*(R(i,j)-L(i,j)+1))。
CODE:
#include<iostream>
#include<cstdio>
using namespace std;
int n, m, f[1001][1001], ans, l[1001][1001], r[1001][1001];
int L[1001][1001], R[1001][1001], h[1001][1001];
char qwq;
int main(){
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
do qwq=getchar();while(qwq!='R'&&qwq!='F');
if(qwq=='F')
f[i][j]=1;
}
for(int i=1; i<=n; i++){
int t=0;
for(int j=1; j<=m; j++)
if(f[i][j]) l[i][j]=t;
else L[i][j]=0, t=j;
t=m+1;
for(int j=m; j>0; j--)
if(f[i][j]) r[i][j]=t;
else R[i][j]=m+1, t=j;
}
for(int i=1; i<=m+1; i++)
R[0][i]=m+1;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
if(f[i][j]){
h[i][j]=h[i-1][j]+1;
L[i][j]=max(l[i][j]+1, L[i-1][j]);
R[i][j]=min(r[i][j]-1, R[i-1][j]);
ans=max(ans, (R[i][j]-L[i][j]+1)*h[i][j]);
}
}
printf("%d", 3*ans);
return 0;
}
以上是关于Luogu4147 玉蟾宫的主要内容,如果未能解决你的问题,请参考以下文章