题意:链接

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

解析:

首先谈到最大子矩阵,我们可能会想到之前做过的盖房子?,那道DP求解的题目。

然而这种题目当然有更高♂端的算法。

比如接下来要谈到的算法①。

我们先来观察数据范围,n,m<=30000,这下就玩完了,怎么dp?

一下子就D掉了你原来的算法,真是不留情面。

那么我们来介绍一种新的算法。

首先谈暴力,枚举各种坏点,但这种的复杂度呢?甚至可能达到6次方,所以怎么优化呢?

按照经验,这种坐标图排个序就能降下复杂度什么的。

于是有神犇介绍了s^2复杂度的算法,其中s为坏点数目。

首先呢,我们先将所有的坏点按照x第一关键字,y第二关键字排序,之后呢,我们枚举基准坏点,也就是作为在左边界上的坏点。假设初始的上边界为最高行,下边界为最低行。之后再扫描在其右面的所有坏点。

每扫到一个点,我们就知道二者的横坐标差距乘以上下边界差距就是目前的一个极大子矩阵的面积。

更新完答案后,还需要对上下边界进行更新,对于本题(即坏点可存在于边界处),当坏点在枚举的点的上方(含在同一行)的时候,如果坏点比当前的上边界要低,则需要更新上边界,要保证在该坏点之后枚举到的极大子矩阵不会包含该坏点。

下边界的讨论同理。

在每一次枚举的最后不要忘了更新一次包含边界的情况。

当然,我们发现,如果从右向左枚举的时候,是不会有包含左边界的情况的(某点在左边界除外),所以为了不遗漏情况,我们还需要从右向左枚举一次。

这样就结束了吗?

并没有。

左右边界都包含的情况并没有枚举到。

所以需要特殊处理一下左右边界都包含的情况,这里我采用的是重新按照y排序处理的。

然后就水过了~

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 5010
using namespace std;
int l,w,n;
struct node
{int x,y;
}pt[N];
int cmp(node a,node b)
{if(a.x==b.x)return a.y<b.y;return a.x<b.x;
}
int cmp2(node a,node b)
{if(a.y==b.y)return a.x<b.x;return a.y>b.y;
}
int main()
{scanf("%d%d%d",&l,&w,&n);if(!n){printf("%d\n",l*w);return 0;}for(int i=1;i<=n;i++)scanf("%d%d",&pt[i].x,&pt[i].y);sort(pt+1,pt+n+1,cmp);int ans=-1;for(int i=1;i<=n;i++){int u=w,d=0;for(int j=i+1;j<=n;j++){ans=max(ans,(pt[j].x-pt[i].x)*(u-d));if(pt[j].y>=pt[i].y)u=min(u,pt[j].y);if(pt[j].y<=pt[i].y)d=max(d,pt[j].y); }ans=max(ans,(l-pt[i].x)*(u-d));}for(int i=n;i>=1;i--){int u=w,d=0;for(int j=i-1;j>=1;j--){ans=max(ans,(pt[i].x-pt[j].x)*(u-d));if(pt[j].y>=pt[i].y)u=min(u,pt[j].y);if(pt[j].y<=pt[i].y)d=max(d,pt[j].y); }ans=max(ans,pt[i].x*(u-d)); }sort(pt+1,pt+n+1,cmp2);for(int i=1;i<n;i++){ans=max(ans,(pt[i].y-pt[i+1].y)*l); }ans=max(ans,(w-pt[1].y)*l);ans=max(ans,pt[n].y*l);printf("%d\n",ans);
}

Vijos 1055 奶牛浴场 最大子矩阵 算♂法①相关推荐

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

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

  2. 汽车学堂 自 动 驾 驶 决 策 与 控 制 算 法——现 代 控 制 理 论学习(一)

    现 代 控 制 理 论学习 前言 一.前馈控制与反馈控制 1.状态反馈控制 2.输出反馈控制 3.输出跟踪控制 4.极点配置法 二.观测器 隆伯格观测器 基于观测器的状态反馈控制 前言 该文章为汽车学 ...

  3. P1578 奶牛浴场

    P1578 奶牛浴场 题意描述:给若干个点组成的矩阵,和一些障碍点,问不包含这些障碍点或者障碍点在其边界上的矩形的最大面积是多少 转载于:https://www.cnblogs.com/wmq1213 ...

  4. python 排列组合算法_排 列 组 合 公 式 及 排 列 组 合 算 法

    排列组合--排列公式的推理和组合 [实操追 - 女资 - 源] [企鹅 : 10⒈ б .x.9 526] 加法原理和乘法原理,是排列组合中的二条基本原理,在解决计数问 题中经常运用.掌握这两条原理, ...

  5. 洛谷 [P1578] WC2002 奶牛浴场

    本题是一道用极大化思想求最大子矩阵的经典题目.这个题目很出名,可以在百度搜索王知昆国家队dalao的论文,其中说的非常详细. 先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行 ...

  6. vijos1055 奶牛浴场

    挺好的一道题呢 O(n^2)或者O(wh) 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 ...

  7. luogu P1578 奶牛浴场

    很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 1 #includ ...

  8. 矩阵基础 (1). 行优先和列优先的问题

    原 矩阵基础 (1). 行优先和列优先的问题 2016年08月18日 18:37:00 林微 阅读数:7351 </div><div class="operating&qu ...

  9. 最大子矩阵问题悬线法 学习笔记

    学习材料:王知昆<浅谈用极大化思想解决最大子矩阵问题> [最大子矩阵问题] 在一个给定的矩形中有一些障碍点,找出内部不包含障碍点的.轮廓与整个矩形平行或重合的最大子矩形. [定义子矩形] ...

最新文章

  1. java udp tcp协议_【java】TCP和UDP传输协议
  2. 大神对飞控精准高度估计算法解读
  3. Asp.net動態添加控件(转)
  4. 瓜田老梁:FA1# 微服务流控防护场景与应对措施
  5. lighttpd在proxy-core下path_info为空的修复
  6. js中的let和var
  7. MySql安全模式下修改root账号密码
  8. QT+VS开发界面入门(qt界面在VS2022实现自动生成槽函数)
  9. 计算机硬盘分区显示不全,windows7系统磁盘分区图标显示不正常的两种解决方法【图】...
  10. 青岛科技大学计算机硕士就业,2021年青岛科技大学专业排行榜,哪个专业就业比较好...
  11. (杂谈)如何在AMD官网下载旧版的驱动
  12. 品牌营销策略:适合初创公司的5种营销方式
  13. 从业多年数据分析师的亲身经验!
  14. html移动端实现手写签名,signature手写签名实现,微信公众号浏览器html手写签名实现
  15. 收藏学习测试论坛,网站
  16. 秒杀tomcat优化
  17. 斗战神服务器正在维护6,斗战神什么时候服务器数据互通_斗战神1月6日、8日服务器数据互通公告_快吧游戏...
  18. 管家婆软件批量导入商品信息教程
  19. kettle Oracle任务输入报错ora22924,ora01555
  20. 4.2k Star!实用的 Mac 进程管理工具

热门文章

  1. linux pptpd 不能上网,CentOS7.7使用pptpd搭建服务器(配置好了,但是不能使用)
  2. Dism 错误 87
  3. 吴晓波最劲爆演讲:终于把传统行业的转型升级都讲清楚了
  4. Modularity(模块化)
  5. 竣达技术丨Modbus 转SNMP网络监控终端
  6. python中extend什么意思_python中extend是什么意思
  7. 三维交互可视化平台(智慧海上牧场平台)学习开发Flask+Vue+Echarts+Mysql+websocket 实战(四)
  8. 微信内链接已禁止访问是什么情况?微信链接防封细节
  9. 【计算机图形学】小白谈计算机图形学(五)
  10. HTML和Css基础知识点笔记