• 2491 玉蟾宫


    2491 玉蟾宫

     

    时间限制: 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

    来源:Nescafe 20

    首先,这是2003ioi集训队论文 王知昆,讲了用极大化思想解决最大子矩形问题 https://wenku.baidu.com/view/a97d0b1c59eef8c75fbfb31b.html

    具体思路都在里边了;

    开始用深搜做了半个小时,我去;

    以下为ac代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 #define n 1001
     6 #define m 1001
     7 int in,me,h[m],l[m],r[m],ans;
     8 bool o[n][m];
     9 int main()
    10 {
    11     char ch[1];
    12     scanf("%d%d",&in,&me);
    13     for(int i=1;i<=in;i++)
    14     for(int j=1;j<=me;j++)
    15     {
    16         scanf("%s",ch)
    17         map[i][j]=(ch[0]=='F')?0:1;
    18     }
    19     for(int j=1;j<=me;j++)
    20     {
    21         h[j]=0;l[j]=1;r[j]=me;
    22     }
    23     for(int i=1,lo,ro;i<=in;i++)
    24     {
    25         lo=0;ro=me+1;
    26         for(int j=1;j<=me;j++)
    27         {
    28              if(o[i][j])
    29             {
    30                 h[j]=0;
    31                 l[j]=1;
    32                 lo=j;
    33             }
    34             else
    35             {
    36                 h[j]++;
    37                 l[j]=max(l[j],lo+1);
    38             } 
    39         }
    40         for(int j=me;j;j--)
    41         {
    42             
    43             if(o[i][j])
    44             {
    45                 r[j]=me;
    46                 ro=j;
    47             }
    48             else 
    49             {
    50                 r[j]=min(r[j],ro-1);
    51                 ans=max(ans,h[j]*(r[j]-l[j]+1)); 
    52             }   
    53         }                               
    54     }
    55     printf("%d",3*ans);
    56     return 0;
    57 }
  • 相关阅读:
    Caesar cipher
    遗传算法之背包问题
    Transport scheme NOT recognized: [stomp]
    error running git
    Canvas 旋转的图片
    canvas时钟
    火箭起飞
    让图标转起来
    Tomcat启动脚本
    Task中的异常处理
  • 原文地址:https://www.cnblogs.com/sssy/p/6739899.html
Copyright © 2020-2023  润新知