P4147 玉蟾宫

题目背景

有一天,小猫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:

  1. 5 6
  2. R F F F F F
  3. F F F F F F
  4. R R R F F F
  5. F F F F F F
  6. F F F F F F
输出样例#1:

  1. 45

这是一道非常经典的题目。看到学长们个个都用悬线法来做,无奈本蒟蒻水平过低,只会用单调栈来切这道题。

我们可以把F看做1,R看做0。

来看下面这个矩阵:

看起来这道题似乎无从下手,但是如果我们把每一列1的连续和求出来,像这样:

也许我们仍然没能发现什么规律,但是不要紧,我们接着看:

             

       

我们尝试以每一行作为这个矩形的底边,找出图中最大的矩形,也就是图中的染色部分,有没有想起点什么?

这不就是poj 2559 Largest Rectangle in a Histogram 这道题吗?这样我们的思路也就得出了,我们可以先对读入的数据预处理一下,统计每一列的连续和,然后对每一行维护一个单调栈,求出以每一行为底的最大矩阵的大小,最后取最大值。

  1. #include<stack>
  2. #include<cstdio>
  3. #include<string>
  4. #include<cstring>
  5. #include<queue>
  6. #include<cmath>
  7. #include<algorithm>
  8. #include<map>
  9. #include<iostream>
  10. #define maxn 1005
  11. using namespace std;
  12.  
  13. stack<int>s;
  14.  
  15. inline int read()
  16. {
  17. char c=getchar();
  18. int res=,x=;
  19. while(c<''||c>'')
  20. {
  21. if(c=='-')
  22. x=-;
  23. c=getchar();
  24. }
  25. while(c>=''&&c<='')
  26. {
  27. res=res*+(c-'');
  28. c=getchar();
  29. }
  30. return x*res;
  31. }
  32.  
  33. long long ans;
  34. int n,m,a[maxn],w[maxn];
  35. int ju[maxn][maxn];
  36. char aa;
  37.  
  38. int main()
  39. {
  40. n=read();m=read();
  41. for(int i=;i<=n;i++)
  42. {
  43. for(int j=;j<=m;j++)
  44. {
  45. scanf("%s",&aa);
  46. if(aa=='F')
  47. {
  48. ju[i][j]=;
  49. }
  50. if(aa=='R')
  51. {
  52. ju[i][j]=;
  53. }
  54. }
  55. }
  56. for(int j=;j<=m;j++)
  57. {
  58. for(int i=;i<=n;i++)
  59. {
  60. if(ju[i][j]==)
  61. {
  62. ju[i][j]=ju[i-][j]+;
  63. }
  64. else
  65. {
  66. ju[i][j]=;
  67. }
  68. }
  69. }
  70. for(int i=;i<=n;i++)
  71. {
  72. for(int j=;j<=m;j++)
  73. {
  74. a[j]=ju[i][j];
  75. }
  76. a[+m]=;
  77. while(s.size()) s.pop();
  78. for(int j=;j<=m+;j++)
  79. {
  80. if(s.empty()||a[j]>=s.top())
  81. {
  82. s.push(a[j]);
  83. w[s.size()]=;
  84. }
  85. else
  86. {
  87. int mi=;
  88. while(!s.empty()&&a[j]<s.top())
  89. {
  90. mi+=w[s.size()];
  91. ans=max(ans,(long long)mi*s.top());
  92. s.pop();
  93. }
  94. s.push(a[j]);
  95. w[s.size()]=mi+;
  96. }
  97. }
  98. }
  99. printf("%lld\n",ans*);
  100. return ;
  101. }

P4147 玉蟾宫--单调栈的更多相关文章

  1. 洛谷P4147 玉蟾宫 单调栈/悬线法

    正解:单调栈/悬线法 解题报告: ummm这题我当初做的时候一点思路也没有只会暴力出奇迹:D(啊听说暴力好像能水过去呢,,, 然后当初是看的题解,然后学了下悬线法 然后就忘了:D 然后我现在看发现看不 ...

  2. bzoj 3039: 玉蟾宫 单调栈或者悬线法求最大子矩阵和

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有一天,小猫rainbow ...

  3. 【BZOJ3039】玉蟾宫 单调栈

    [BZOJ3039]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子 ...

  4. [tyvj]P1939玉蟾宫[单调栈]

    [tyvj]P1939 玉蟾宫 ——!x^n+y^n=z^n 背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 描述 这 ...

  5. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  6. 悬线法 || BZOJ3039: 玉蟾宫 || Luogu P4147 玉蟾宫

    题面: P4147 玉蟾宫 题解:过于板子举报了 #include<cstdio> #include<cstring> #include<iostream> #de ...

  7. P4147 玉蟾宫

    P4147 玉蟾宫 给定一个 \(N * M\) 的矩阵 求最大的全为 \(F\) 的子矩阵 Solution 悬线法 限制条件为转移来的和现在的都为 \(F\) Code #include<i ...

  8. P4147 玉蟾宫(悬线法求最大子矩阵)

    P4147 玉蟾宫 悬线法 ,\(l_{i,j},r_{i,j},up_{i,j}\) 分别表示 \((i,j)\) 这个点向左,右,上能到达的远点.然后面积就很好办了.具体实现见代码. 然而,还有更 ...

  9. [Luogu P4147] 玉蟾宫 (网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P4147 Solution 裸的求极大子矩阵 感谢wzj dalao的教学 首先,有一个很显然但很重要的结论 ...

随机推荐

  1. CodeForces Round #553 Div2

    A. Maxim and Biology 代码: #include <bits/stdc++.h> using namespace std; int N; string s; int mi ...

  2. redis--主从同步,故障切换,集群搭建

    一 . redis主从同步 准备三个配置文件,实现一主两从的redis数据库结构(这三个配置文件仅仅端口不一样) # redis-6379.conf 文件, 写入下面数据: port 6379 dae ...

  3. 利用JDBC工具类 模拟用户登录!

    一.建库 设置 id为主键并自增! 二.定义登录接口 package com.aaa.dao; public interface IDengDao { /* 1.定义一个登陆的接口,参数是name 和 ...

  4. linux 命令ls

    命令格式 ls -la /etc -a  查看所有隐藏文件 以.开头的,就是隐藏文件.改名.开头,就可以改成隐藏文件 -l  长格式显示 ]# ls -al total 8 drwxr-xr-x    ...

  5. jsp篇 之 基本概念

    Jsp概念: 1.jsp是什么 jsp全称Java Server Pages,是一种[动态网页开发技术]. .html文件是静态页面 .jsp 文件是动态页面 jsp页面允许我们在html代码中[嵌入 ...

  6. Web框架的原理和Django初识

    一.Web框架的本质 1.本质 实际上Web应用本质上就是一个socket服务端, 而用户的浏览器就是一个socket客户端. 2.最原始的web框架 socket服务端 import socket ...

  7. Java基础-1

    基础知识 1.进制 1.十进制 2.二进制 3.十六进制 2.十六进制转换 二进制转换 十进制转换

  8. Android学习第十天

    计算机表示图形的几种方式 a)         Bmp:以高质量保存,用于计算机 b)         Jpg:以良好的质量保存,用于计算机或网络 c)         Png:以高质量保存 d)   ...

  9. CF95C Volleyball

    题意翻译 给出一个图,双向边,边上有权值代表路的距离,然后每个点上有两个值,t,c,t代表能从这个点最远沿边走t,且不能在半路下来,花费是c 现在告诉你起点终点,问最少的花费 点个数1000,边个数1 ...

  10. MYSQL IN 出现的慢查询问题

    IN = https://blog.csdn.net/solmyr_biti/article/details/54293492 https://www.cnblogs.com/wxw16/p/6105 ...