题解 Code[vs] P2491 玉蟾宫

P2491 玉蟾宫


时间限制: 1 s
空间限制: 64000 KB
题目等级 : 大师 Master


题目描述 Description

有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
这片土地被分成N*M个格子,每个格子里写着'R'或者'F',R代表这块土地被赐予了rainbow,F代表这块土地被赐予了freda。
现在freda要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着'F'并且面积最大。
但是rainbow和freda的OI水平都弱爆了,找不出这块土地,而蓝兔也想看freda卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为S,它们每人给你S两银子。

输入描述 Input Description

第一行两个整数N,M,表示矩形土地有N行M列。
接下来N行,每行M个用空格隔开的字符'F'或'R',描述了矩形土地。

输出描述 Output Description

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

样例输入 Sample Input

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

样例输出 Sample Output

45

数据范围及提示 Data Size & Hint

对于50%的数据,1<=N,M<=200
对于100%的数据,1<=N,M<=1000

题解

如果用单纯的暴力搜索,可得其复杂度为O(n^4),显然是会TLE的,所以我们应用DP来优化
网上有其他神犇用单调栈优化的O(n3)做法,而显然我这种蒟蒻是无法参透的,我在这里要讲的是一种线性DP做法,优化后复杂度O(n2)
首先我们对于每个标记为F的点(i,j)维护两个数组l[i][j]和r[i][j],l[i][j]表示(i,j)这个点向左扩展最远能到达的点的列坐标-1,r[i][j]维护(i,j)这个点向右扩展最远能到达的点的列坐标+1,若该点被标记为R,则l[i][j]=0,r[i][j]=m+1
在这里我们计算面积的思路是每次算出以(i,j)点所在行为底的最大矩形面积,所以要再维护两个数组L[i][j]和R[i][j],表示该点所在矩形的底的左右端点的列坐标,h[i][j]维护该矩形高,此时状态转移方程显而易见:
L[i][j]=max(l[i][j]+1,L[i-1][j]);
R[i][j]=min(r[i][j]-1,R[i-1][j]);
h[i][j]=h[i-1][j]+1;
我们在维护一个ans初始值为0,每次算出一个面积值,若大于ans则进行更新,最后直接输出ans*3即可,代码如下

C++代码

/*
    Name:Toad Palace
    Copyright:Ricardo_Y_Li
    Author:Ricardo_Y_Li
    Date: 09/07/17 21:23
    Description:NULL
*/

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

bool map[1010][1010];
int l[1010][1010],r[1010][1010];
int L[1010][1010],R[1010][1010],h[1010][1010];
int n,m,ans=0;

int main(){
    ios::sync_with_stdio(false);
    memset(map,0,sizeof(map));
    memset(h,0,sizeof(h));
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            char c;
            cin>>c;
            if(c=='F')
                map[i][j]=1;
        }
    for(int i=1;i<=n;i++){
        int t=0;
        for(int j=1;j<=m;j++){
            if(map[i][j])
                l[i][j]=t;
            else{
                L[i][j]=0;
                t=j;
            }
        }
        t=m+1;
        for(int j=m;j>=1;j--){
            if(map[i][j])
                r[i][j]=t;
            else{
                R[i][j]=m+1;
                t=j;
            }
        }
    }
    for(int i=1;i<=m;i++){
        R[0][i]=m+1;
        L[0][i]=0;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(map[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]);
            int s=(R[i][j]-L[i][j]+1)*h[i][j];
            if(ans<s)
                ans=s;
            }
        }
    cout<<ans*3;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,209评论 0 6
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,791评论 0 6
  • 姓名:彭万红 单位:广东顺创律师事务所 早读日期:2017年11月1日,早读第3天,开始于2017年10月 30日...
    1b5f4a5ab414阅读 122评论 0 0
  • 屯西刘福贵死了,死于急性脑出血。 事情来得突然,刘家人完全没有防备,一时间忙乱不堪。不过这一家人老老小小的倒也没有...
    冬妮娅阅读 453评论 2 2