• TYVJ1939 玉蟾宫


    背景

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

    描述

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

    输入格式

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

    输出格式

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

    测试样例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

    输出

    45

    备注

    对于50%的数据,1<=N,M<=200
    对于100%的数据,1<=N,M<=1000
     
     
    扫描处理每列。对于每一列j,枚举该列上F的长度h[j],再从左往右扫一遍,找h[j]高度的F能向左延伸到多远,再从右往左扫,找向右延伸的距离。左右边界和高度确定后,计算面积并更新最优解。
    左右扫描的过程中用单调栈维护最小高度。
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 const int mxn=1200;
     8 int st[mxn],top;
     9 int h[mxn];
    10 int mp[mxn][mxn];
    11 int le[mxn],re[mxn];
    12 int ans=0;
    13 int n,m;
    14 void read(){//读入 
    15     char s;
    16     for(int i=1;i<=n;i++){
    17         for(int j=1;j<=m;j++){
    18             s=getchar();
    19             while(s!='F' && s!='R')s=getchar();
    20             mp[i][j]=(s=='F');
    21         }
    22     }
    23     return;
    24 }
    25 int main(){
    26     scanf("%d%d",&n,&m);
    27     int i,j;
    28     read();
    29     for(i=1;i<=n;i++){//
    30         for(j=1;j<=m;j++){//
    31             if(mp[i][j])h[j]++;
    32             else h[j]=0;
    33         }
    34         top=0;
    35         st[0]=0;
    36         for(j=1;j<=m;j++){
    37             while(top && h[st[top]]>=h[j])top--;//单调栈维护边界 
    38             le[j]=st[top];//左边界 
    39             st[++top]=j;//入栈 
    40         }
    41         top=0;
    42         st[0]=m+1;
    43         for(j=m;j;j--){
    44             while(top && h[st[top]]>=h[j])top--;
    45             re[j]=st[top]-1;
    46             st[++top]=j;
    47         }
    48         for(j=1;j<=m;j++){
    49 //            printf("test: I:%d J:%d L:%d R:%d H:%d 
    ",i,j,le[j],re[j],h[j]);
    50             ans=max(ans,(re[j]-le[j])*h[j]);
    51         }
    52     }
    53     printf("%d
    ",3*ans);
    54     return 0;
    55 }
  • 相关阅读:
    深入理解计算机系统(第三版)作业题答案(第三章)
    深入理解计算机系统(第三版)作业题答案(第二章)
    greedy算法(python版)
    Dijkstra算法(Swift版)
    Breadth-first search 算法(Swift版)
    递归演示程序(swift)
    Node.js之异步流控制
    Node.js之单利模式
    Node.js之循环依赖
    一个完整的Node.js RESTful API
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5641481.html
Copyright © 2020-2023  润新知