洛谷4147:玉蟾宫——题解

https://www.luogu.org/problemnew/show/P4147#sub

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

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

输出最大面积*3。

请食用王知昆论文:http://blog.csdn.net/twtsa/article/details/8120269,和洛谷第一篇题解。

代码参自洛谷第一篇题解,然而那篇题解多了两个无用数组。

这里使用的是算法2(也叫悬线法)

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1010;
inline char getc(){
    char ch=getchar();
    while(ch!='R'&&ch!='F')ch=getchar();
    return ch;
}
int n,m,ans,mp[N][N],h[N][N],l[N][N],r[N][N];
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
        char ch=getc();
        mp[i][j]=(ch=='F');
    }
    }
    for(int i=1;i<=n;i++){
    int t=0;
    for(int j=1;j<=m;j++){
        if(mp[i][j])l[i][j]=t;
        else l[i][j]=0,t=j;
    }
    t=m+1;
    for(int j=m;j>=1;j--){
        if(mp[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(mp[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;
}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

原文地址:https://www.cnblogs.com/luyouqi233/p/8523073.html