题意:链接

方法:最大子矩阵之算♂法②

解析:

首先这道题单调栈DP是肯定能过的,但是一点都不高端!

什么年代了还用这种方式!

所以如何彰显自己是个高端的人呢?

悬线法能满足你的需求!

什么是悬线法?

首先对于悬线的定义,对于一个n*m的坐标图中的任意一点,其向上能延伸的一个线段(不碰到坏点)称为悬线。

如果定义h[i,j]代表(i,j)该点的悬线长度。

那么,如果其上方的点是坏点,则悬线长度为0,该点为坏点,悬线长度为0,否则的话,为上方的点的悬线长度加1。

如果这么统计的话,那么最终的悬线长度应该为h[i,j]+1,不清楚自行观察。

然后呢对于一个悬线,我们欲知道最大子矩阵的大小的时候,需要将该悬线平移,即其向左能平移多长距离,向右能平移多长距离,不妨令l[i,j]为向左平移多少距离,r[i,j]为向右平移多长距离,便于统计,我们将坏点的这两种值置为0,非坏点的l为前1点+1,r为后一点+1,最终的l+r-1即为该矩阵的长,又悬线为宽,所以面积可以拿出。

但是怎么实现呢?

首先我们先假设所有的l,r都是对于本行的,那么很容易的就能处理出来所有点的l,r。复杂度2nm

之后我们枚举所有的非坏点,在更新h的同时,更新l,r,很容易发现,当前点的l应该是其上方的点的l与该点在其本行的l的较小者。不妨假设悬线长为2,那么随便画个图就能知道。悬线长大于2呢?又是个递归思想。

r的处理同理。

那么最终所有点的(h+1)*(l+r-1)就是该点对应的最大子矩阵面积。

可能有人会说,这样的话下边界不是最远距离啊?

但是别忘了,我们是按次序枚举的,也就是说,最远的下边界上的点我们一定会枚举到,在该点时便会更新。

这个算法与①有什么区别呢?

它的复杂度为n*m,在图较小的时候显然适合这种方法。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1010
using namespace std;
int l,w;
int h[N][N];
int le[N][N];
int ri[N][N];
int map[N][N];
char s[2];
int main()
{scanf("%d%d",&l,&w);for(int i=1;i<=l;i++){for(int j=1;j<=w;j++){scanf("%s",s);if(s[0]=='F')map[i][j]=1;}}for(int i=1;i<=l;i++){for(int j=1;j<=w;j++){if(!map[i][j])le[i][j]=0;else le[i][j]=le[i][j-1]+1;}for(int j=w;j>=1;j--){if(!map[i][j])ri[i][j]=0;else ri[i][j]=ri[i][j+1]+1;}}for(int i=1;i<=l;i++){for(int j=1;j<=w;j++){if(map[i-1][j]&&map[i][j]){h[i][j]=h[i-1][j]+1;le[i][j]=min(le[i][j],le[i-1][j]);ri[i][j]=min(ri[i][j],ri[i-1][j]);}}}int ans=0;for(int i=1;i<=l;i++){for(int j=1;j<=w;j++){ans=max(ans,(h[i][j]+1)*(le[i][j]+ri[i][j]-1));}}printf("%d\n",ans*3);
}

BZOJ 3039 玉蟾宫 最大子矩阵 算♂法②相关推荐

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

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

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

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

  3. BZOJ 3039: 玉蟾宫

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

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

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

  5. BZOJ 3039 玉蟾宫

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

  6. bzoj 3039 玉蟾宫 单调栈

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

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

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

  8. 洛谷 P4147 玉蟾宫【悬线法/单调栈】

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

  9. Vijos 1055 奶牛浴场 最大子矩阵 算♂法①

    题意:链接 方法:最大子矩阵之算♂法① 解析: 首先谈到最大子矩阵,我们可能会想到之前做过的盖房子?,那道DP求解的题目. 然而这种题目当然有更高♂端的算法. 比如接下来要谈到的算法①. 我们先来观察 ...

最新文章

  1. 拒绝加班,办公电脑换新低至¥1999
  2. 第十六届全国大学生智能车竞赛航天智慧物流竞赛成绩与奖项
  3. java邮件客户端源代码,JAVA基于B/S模式下的电子邮件客户端软件,源码分享
  4. python多线程--theading模块
  5. python使用线性回归实现房价预测
  6. STM32F4_USART配置及细节描述
  7. mysql hy093_请问SQLSTATE [HY093]:参数号无效:未定义参数
  8. mysql 建立一棵树_如何存储一颗树到文件或者数据库
  9. 传统开发被冲击得“七零八落”,云原生时代下开发者要如何自救?
  10. MySQL错误Another MySQL daemon already running with the same unix socket.
  11. 答题活动助手小程序更新记录
  12. 如何在计算机设置鼠标宏,鼠标宏设置教程
  13. 2022年金属非金属矿山(地下矿山)主要负责人考试题及模拟考试
  14. linux卸载软件垃圾清理,Ubuntu20.04系统卸载软件及清理系统垃圾缓存以及新力得...
  15. Linux磁盘管理之GPT分区,磁盘管理之MBR与GPT分区
  16. Excel VBA将所有Sheet重命名为单元格a1的名称
  17. C#和WPF实现图形化编程
  18. matlab函数之bsxfun
  19. 系统设计与分析课程项目个人小结
  20. Ubuntu22.04 中Drag and drop is not supported问题

热门文章

  1. python线程详解爬小说_python--多线程爬取顶点小说()
  2. 高仿QQ2012登录界面
  3. UE4 C++:事件绑定(输入、碰撞检测、定时器)
  4. 计量经济学(1.1)
  5. No mudule named arbotix_msgs
  6. 为什么起床后不能收邮件?
  7. python并发编程之semaphore(信号量)_python并发编程之Semaphore(信号量)
  8. 鸢尾花分类python_二元逻辑回归实现鸢尾花数据分类(python)
  9. html特性速记图,html知识点速记
  10. 包子笔记 - 债市和封闭基金以及开放基金