Description

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

Input

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

Output

输出一个整数,表示你能得到多少银子,即(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

HINT

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

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

题意:给你一个0 1的矩阵,求最大的全是1的矩阵。

题解:枚举矩形下方的两个点(这个过程只需要枚举3个坐标),然后再找最大能够向上延伸多高。容易预处理出每个位置向上最多延伸多高,那么要求的就是这两个点直接所有点(包括这两个点)的延伸高度的最小值。

   对于区间最小值作贡献问题,一个常用的套路是枚举最小值,考虑贡献。那么可以使用单调栈(查询向左和向右第一个小于它的高度的值,向左向右维护一个单调递增的栈即可)处理出一个数左边第一个小于它的位置和右边第一个小于它的位置。这两个位置之间的都大于它,此时这个数作为最小值,最大宽度为位置差,直接计算贡献即可。O(n*m)
暴力(n^3) 不能过的

#include <bits/stdc++.h>const int maxn=1005;
int n, m, a[maxn][maxn];int main()
{char s[10];scanf("%d%d", &n, &m);for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){scanf("%s", s);a[i][j]= s[0]=='F'? 1+a[i][j-1]:a[i][j-1];}int ans=0;for(int l=1; l<=m; l++)for(int r=l; r<=m; r++){int tans=0;for(int i=1; i<=n; i++){if(a[i][r]-a[i][l-1]==r-l+1) tans+=a[i][r]-a[i][l-1];else tans=0;ans=std::max(ans, tans);}}printf("%d\n", ans*3);return 0;
}

View Code

单调栈:

/**************************************************************Problem: 3039User: strangersLanguage: C++Result: AcceptedTime:780 msMemory:5244 kb
****************************************************************/#include <bits/stdc++.h>const int maxn=1005;
int n, m, a[maxn][maxn];
int ls[maxn], rs[maxn], stk[maxn], top;void debug()
{for(int i=1; i<=m; i++)printf("ls[%d]=%d, rs[%d]=%d ", i, ls[i], i, rs[i]);printf("\n");
}int main()
{char s[10];scanf("%d%d", &n, &m);for(int i=1; i<=n; i++)for(int j=1; j<=m; j++){scanf("%s", s);a[i][j]= s[0]=='F'? 1+a[i-1][j]:0;}int ans=0;for(int i=1; i<=n; i++){top=0, stk[top]=0;for(int j=1; j<=m; j++){while(top && a[i][stk[top]]>=a[i][j]) top--;ls[j]=stk[top], stk[++top]=j;}top=0, stk[top]=m+1;for(int j=m; j; j--){while(top && a[i][stk[top]]>=a[i][j]) top--;rs[j]=stk[top], stk[++top]=j;}//debug();for(int j=1; j<=m; j++)ans=std::max(ans, a[i][j]*(rs[j]-ls[j]-1));}printf("%d\n", ans*3);return 0;
}

View Code

转载于:https://www.cnblogs.com/Yokel062/p/11508608.html

BZOJ 3039 玉蟾宫相关推荐

  1. BZOJ 3039: 玉蟾宫

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

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

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

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

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 975  Solved: 562 [Submit][Status][Discuss] ...

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

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

  5. bzoj 3039 玉蟾宫 单调栈

    预处理出每个点向上扩展的高度,对于每一行维护单调递增的栈,在弹出元素的时候统计答案. #include<iostream> #include<cstdio> #include& ...

  6. BZOJ 3039 玉蟾宫 最大子矩阵 算♂法②

    题意:链接 方法:最大子矩阵之算♂法② 解析: 首先这道题单调栈DP是肯定能过的,但是一点都不高端! 什么年代了还用这种方式! 所以如何彰显自己是个高端的人呢? 悬线法能满足你的需求! 什么是悬线法? ...

  7. 【BZOJ】3039: 玉蟾宫(DP/单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...

  8. 【BZOJ-30391057】玉蟾宫棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 753  Solved: 444 [Submit][Status][Discuss] ...

  9. bzoj3039 玉蟾宫

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 606  Solved: 367 [Submit][Status][Discuss] ...

最新文章

  1. 苹果2010新品发布会图文实录
  2. 用PIL读取保存图片错误 :OSError: cannot write mode RGBA as JPEG
  3. c语言将数组变为空,求助~~ 如何把数组变成动态输入的?
  4. 再高深的 Python 面试难题,这门课都给你整得明明白白!
  5. Android获取当前位置的三种方式及其使用方法
  6. java 视频 缩略图_如何使用java提取视频缩略图或某一帧的图片
  7. Log4j(1)--hellloworld
  8. python检测输入文本的语言
  9. php 生成word的三种方式
  10. java 多线程(生产者消费者)
  11. Android通过RecyclerView实现手风琴效果
  12. LINUX安装KDC服务
  13. 双11临近,电脑无缘无故的弹出了双11天猫广告,必须追踪到底
  14. matlab 画柱状图和误差棒,小白1分钟绘图:带误差棒的柱状图
  15. Python爬虫实战(1):抓取毒舌电影最新推送
  16. 打包微服务前后端分离项目并部署到服务器 --- 分布式 Spring Cloud + 页面渲染 Nuxt.js
  17. c++软件开发面试旋极面试题_北京旋极信息技术股份有限公司2015招聘
  18. RealView® 编译工具 汇编器指南
  19. 如何优雅的写 Controller 层代码?找对姿势!
  20. 【连载】《linux入门很简单》电子版——作者:刘金鹏(序:一切的起因2)

热门文章

  1. Android中MVP框架理解
  2. Centos上卸载阿里云盾
  3. STM32H7B0 HAL OSPI配置的一次失败原因分享
  4. 自己做饭吃,怎样从极耗时的买菜、择菜、洗菜、切菜、配菜中解脱出来?
  5. Amcharts属性的含义
  6. java bks证书_jks bks 等的定义 如何将jks转化为bks的
  7. Vultr能Ping通但SSH无法连接
  8. 古典密码分析(冗余度,唯一解距离,语言统计,重合指数)
  9. js修改服务器域名,春哥详解:业务域名 JS接口安全域名 网页授权域名
  10. 小鹏用计算机计算38X596时,物理化学-表面化学部分选择题