题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍

   求最大子矩阵(悬线法模板)

把每个格子向上延伸的空格看做一条悬线

以le[i][j],re[i][j],up[i][j]分别记录该悬线向左,向右的运动极限以及向上的延伸长度

ans=max(ans,(up[i][j]*(re[i][j]-le[i][j]+1)));

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cctype>
  5. #include<algorithm>
  6. using namespace std;
  7. #define int long long
  8. #define olinr return
  9. #define _ 0
  10. #define love_nmr 0
  11. #define DB double
  12. inline int read()
  13. {
  14. int x=,f=;
  15. char ch=getchar();
  16. while(!isdigit(ch))
  17. {
  18. if(ch=='-')
  19. f=-f;
  20. ch=getchar();
  21. }
  22. while(isdigit(ch))
  23. {
  24. x=(x<<)+(x<<)+(ch^);
  25. ch=getchar();
  26. }
  27. return x*f;
  28. }
  29. inline void put(int x)
  30. {
  31. if(x<)
  32. {
  33. x=-x;
  34. putchar('-');
  35. }
  36. if(x>)
  37. put(x/);
  38. putchar(x%+'');
  39. }
  40. int n;
  41. int m;
  42. bool mp[][];
  43. int le[][];
  44. int re[][];
  45. int up[][];
  46. int T;
  47. inline void init()
  48. {
  49. for(int i=;i<=n;i++)
  50. for(int j=;j<=m;j++)
  51. {
  52. char ch=getchar();
  53. while(!isupper(ch)) ch=getchar();
  54. if(ch=='F')
  55. mp[i][j]=true;
  56. else
  57. mp[i][j]=false;
  58. }
  59. }
  60. inline int work()
  61. {
  62. int ans=;
  63. for(int i=;i<=n;i++)
  64. {
  65. int l=; //当前障碍的位置
  66. int r=m+;
  67. for(int j=;j<=m;j++)
  68. {
  69. if(!mp[i][j]) //有障碍
  70. {
  71. up[i][j]=le[i][j]=;
  72. l=j;
  73. }
  74. else
  75. {
  76. up[i][j]=i==? :up[i-][j]+; //更新
  77. le[i][j]=i==? l+:max(le[i-][j],l+);
  78. }
  79. }
  80. for(int j=m;j>=;j--)
  81. {
  82. if(!mp[i][j])
  83. {
  84. re[i][j]=m+;
  85. r=j;
  86. }
  87. else
  88. {
  89. re[i][j]=i==? r-:min(r-,re[i-][j]); //更新re
  90. ans=max(ans,up[i][j]*(re[i][j]-le[i][j]+)); //更新答案
  91. }
  92. }
  93. }
  94. return ans*; //要求面积*3
  95. }
  96. signed main()
  97. {
  98. T=read();
  99. while(T--)
  100. {
  101. n=read();
  102. m=read();
  103. init();
  104. put(work());
  105. putchar('\n');
  106. }
  107. olinr ~~(^_^)+love_nmr;
  108. }
  109. /*
  110. 2
  111. 5 6
  112. RFFFFF
  113. FFFFFF
  114. RRRFFF
  115. FFFFFF
  116. FFFFFF
  117. 5 5
  118. RRRRR
  119. RRRRR
  120. RRRRR
  121. RRRRR
  122. RRRRR
  123. */

City Game UVALive - 3029(悬线法求最大子矩阵)的更多相关文章

  1. BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

    1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑 ...

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

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

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

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

  4. hdu4328(经典dp用悬线法求最大子矩形)

    http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右 ...

  5. bzoj 3039 悬线法求最大01子矩阵

    首先预处理每个F点左右,下一共有多少个F点,然后 对于每个为0的点(R),从这个点开始,一直到这个点 下面第一个R点,这一区间中的min(左),min(右)更新答案. ps:我估计这道题数据有的格式不 ...

  6. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

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

  7. BZOJ 1057: [ZJOI2007]棋盘制作( dp + 悬线法 )

    对于第一问, 简单的dp. f(i, j)表示以(i, j)为左上角的最大正方形, f(i, j) = min( f(i + 1, j), f(i, j + 1), f(i + 1, j + 1)) ...

  8. 2018.09.29 bzoj3885: Cow Rectangles(悬线法+二分)

    传送门 对于第一个问题,直接用悬线法求出最大的子矩阵面积,然后对于每一个能得到最大面积的矩阵,我们用二分法去掉四周的空白部分来更新第二个答案. 代码: #include<bits/stdc++. ...

  9. 【UVALive】3029 City Game(悬线法)

    题目 传送门:QWQ 分析 以前见到过差不多的这题. xhk说是单调栈水题,但我又不会单调栈,于是当时就放下了. 这么久过去了我还是不会用单调栈做这题,用的是悬线法. 非常好写 代码 #include ...

随机推荐

  1. Ubuntu下设置VNCServer

    Ubuntu下设置VNCServer Virtual Network Computing(VNC)是进行远程桌面控制的一个软件.客户端的键盘输入和鼠标操作通过网络传输到远程服务器,控制服务器的操作.服 ...

  2. vue中父子组件传递信息实现

    为了能够在父子组件中实现双向控制,需要以下的步骤: 第一步:子组件中挖坑 (1)在需要父组件填充具体内容的地方挖坑,方式为 <slot name="message">& ...

  3. 11-03SQLserver基础--子查询语句

    一.子查询--查询的嵌套(重点记忆) select MAX(age)from haha where bumen='销售部' --汇总-- select MAX(age)from haha where  ...

  4. C#在线预览文档(word,excel,pdf,txt,png)

    C#在线预览文档(word,excel,pdf,txt,png) 1.预览方式:将word文件转换成html文件然后预览html文件2.预览word文件:需要引入Interop.Microsoft.O ...

  5. 问题:oracle floor;结果:Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明

    Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明 (2011-04-06 16:10:35) 转载▼ 标签: 谈 分类: 渐行渐远 FLOOR——对给定的数字取 ...

  6. Delphi Cookie

    Cookie IdHTTP1.CookieManager.AddCookies(); IdHTTP1.Post(); IdHTTP1.Get('http://1.1.1.1:9000/'); for ...

  7. CORS实现跨域Ajax

    客户端 #!/usr/bin/env python import tornado.ioloop import tornado.web class MainHandler(tornado.web.Req ...

  8. java 矩阵转置算法

    工作中用到了行列转置,把这两种情况的算法记下来,以便后用 1.行列数相等的转置 /** * @description 矩阵转置 * @author oldmonk * @time 2017年8月18日 ...

  9. JS Number类型数字位数及IEEE754标准

    JS的基础类型Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit.如图 意义 1位用来表示符号位 11位用来表示指数 52位表示尾数 浮 ...

  10. 内核文件ntoskrnl.exe,ntkrnlpa.exe的区别??

    除了标题中说到的两个exe文件之外,还有另外两个ntkrnlmp.exe和ntkrpamp.exe.因为我目前用到的只是标题中的两个. 其中,我在网上搜索到的关于SSDT HOOK 的资料,举的例子, ...