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

题目描述
这片土地被分成 N×MN\times MN×M 个格子,每个格子里写着 ‘R’ 或者 ‘F’,R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。

现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 ‘F’ 并且面积最大。

但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 SSS ,它们每人给你 SSS 两银子。

输入格式

第一行两个整数 NNN,MMM,表示矩形土地有 NNN 行 MMM 列。

接下来 NNN 行,每行 MMM 个用空格隔开的字符 ‘F’ 或 ‘R’,描述了矩形土地。

输出格式
输出一个整数,表示你能得到多少银子,即 (3×最大 ’F’ 矩形土地面积)3\times \text{最大 'F' 矩形土地面积})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

输出 #1

45

说明/提示
对于 50%50\%50% 的数据,1≤N,M≤2001 \leq N, M \leq 2001≤N,M≤200 。
对于 100%100\%100% 的数据,1≤N,M≤10001 \leq N, M \leq 10001≤N,M≤1000 。


解法1 悬线法

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int u[maxn][maxn], l[maxn][maxn], r[maxn][maxn];
int n, m, ans;
char c;
bool area[maxn][maxn];
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {cin >> c;area[i][j] = (c == 'F');if (area[i][j]) { //可选方格u[i][j] = u[i - 1][j] + 1;l[i][j] = l[i][j - 1] + 1;}}}for (int i = 1; i <= n; ++i)for (int j = m; j >= 1; --j)if (area[i][j]) //可选方格r[i][j] = r[i][j + 1] + 1;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (area[i][j]) { //可选方格,有悬线if (area[i - 1][j]) {l[i][j] = min(l[i][j], l[i - 1][j]);r[i][j] = min(r[i][j], r[i - 1][j]);}ans = max(ans, u[i][j] * (l[i][j] + r[i][j] - 1));}}}printf("%d\n", ans * 3);return 0;
}


解法2 单调栈

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int u[maxn], n, m, ans;
char c;
bool area[maxn][maxn];
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; ++i) {stack<pair<int, int>> st; //height, widthint maxArea = 0; //以这一层的某些方格为下边界的、最大矩形的面积for (int j = 1; j <= m + 1; ++j) {if (j <= m) { //[1,m]时读入并计算高度cin >> c;area[i][j] = (c == 'F');if (area[i][j]) ++u[j]; //可选方格else u[j] = 0; //高度清零}int totWidth = 0, height = j <= m ? u[j] : 0; 最后多加一个0高度柱子作为哨兵while (!st.empty() && height < st.top().first) {totWidth += st.top().second;maxArea = max(maxArea, totWidth * st.top().first);st.pop();}st.push(pair<int, int>{height, totWidth + 1});}ans = max(ans, maxArea);}printf("%d\n", ans * 3);return 0;
}

洛谷 P4147 玉蟾宫【悬线法/单调栈】相关推荐

  1. [P4147 玉蟾宫(悬线法)

    题目链接: P4147 玉蟾宫 题目大意: n ∗ m n∗m n∗m的矩阵,求最大的全 F F F矩阵面积 ∗ 3 *3 ∗3. 思路:悬线法. 参考代码: #include <bits/st ...

  2. 洛谷 P4147 玉蟾宫 P1169 [ZJOI2007]棋盘制作(求最大子矩阵)

    题目: P4147 玉蟾宫: https://www.luogu.org/problemnew/show/P4147  P1169 [ZJOI2007]棋盘制作: https://www.luogu. ...

  3. BZOJ 3039: 玉蟾宫( 悬线法 )

    最大子矩阵...悬线法..时间复杂度O(nm) 悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ----------------------- ...

  4. BZOJ[3039]玉蟾宫 悬线法

    题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=3039 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山 ...

  5. 刷题记录:洛谷P4147玉蟾宫

    传送门:洛谷 题目描述: 这片土地被分成 N × M N\times M N×M 个格子,每个格子里写着 'R' 或者 'F',R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 fr ...

  6. 洛谷 P4147 玉蟾宫

    这好像是一道悬线法的题目,但是我不会,只能用单调栈水过了 我们将ai,ja_{i,j}ai,j​定义为从(i,j)(i,j)(i,j)出发向上(坐标减小)可以达到的最长的.没有R的路径 比如说样例 5 ...

  7. 洛谷 P4147 玉蟾宫 题解【悬线dp】

    原题地址 蛤,今天正好学习一下悬线dp,写了个板子题. 用 l [ i ] [ j ] l[i][j] l[i][j]表示能延伸的最左的位置的列, r [ i ] [ j ] r[i][j] r[i] ...

  8. 洛谷P4147 玉蟾宫(单调栈解决)

    题目 题目链接 题目背景 有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成 N\times ...

  9. 洛谷P1169 棋盘制作(悬线法)

    题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...

最新文章

  1. Swift 3.0 预告:将 Objc 库转换成更符合 Swift 语法风格的形式
  2. javap分析字符串拼接执行流程
  3. 要鼓励周鸿祎做360搜索
  4. java comparator内部类_java - Java Comparator使用.reverseOrder()但内部类 - 堆栈内存溢出...
  5. 微海鼠标自动点击器 支持录制和循环播放
  6. python怎么画长方体_将长方体绘制为图像
  7. 【软件工程】需求分析文档——需求规格说明书
  8. ae效果英文版翻译对照表_AE CS6 最全特效中英翻译
  9. c语言在线考试系统的需求分析,在线考试系统需求分析.doc
  10. [高通MSM8953_64][Android10]新增并挂载custom分区
  11. POJ1251 Jungle Roads(kru)
  12. python能为我们做什么读后感作文_《与运气竞争》读书笔记 坚韧不拔|静水流深|读书|写作|博雅|数据分析|Python|商业|独立·独特·自立门户 kebook...
  13. ​电子投票系统与区块链
  14. 中蜂几月份自然分蜂_中蜂一年自然分蜂几次?_库百科养蜂养殖
  15. Protel 2004 的PCB中整体修改元件的技巧
  16. 信号与系统_线性时不变系统
  17. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)
  18. 使用.NET Micro ORM “Symbiotic”的简单 CRUD
  19. 苹果输入法怎么换行_最全的输入法皮肤,你想要的百度输入法都有
  20. 专业的个人记帐软件 爱上记帐 1.0.1

热门文章

  1. 仿剩余金额宝数字渐慢跳动效果
  2. 用python画好看的图片,几张好看的HTML图片和利用Python画的好看的图
  3. Amcharts4使用笔记
  4. 已解决UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x93 in position 20651: illegal multibyte seque
  5. 微软消息队列-MSMQ
  6. native数据类型 react_react-native中使用realm数据库
  7. java8 Stream分组求和reducing分组求最大值
  8. 一篇文让你看懂NB-IoT、LoRa、eMTC、Sigfox及ZigBee的应用场景
  9. springboot实现oos上传下载
  10. python饿了么商家开放平台模拟网页http请求实战