博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用极大化思想解决矩形问题学习笔记
阅读量:4354 次
发布时间:2019-06-07

本文共 1755 字,大约阅读时间需要 5 分钟。

用极大化思想解决矩形问题学习笔记

  • 问题引入:

Winter Camp2002,奶牛浴场

题意简述

John要在矩形牛场中建造一个大型浴场,但是这个大型浴场不能包含任何一个奶牛的产奶点,但产奶点可以出在浴场的边界上。John的牛场和规划的浴场都是矩形,浴场要完全位于牛场之内,并且浴场的轮廓要与牛场的轮廓平行或者重合。要求所求浴场的面积尽可能大。

参数约定:产奶点的个数S不超过5000,牛场的范围N×M不超过30000×30000。

输入:

10 10 4 1 1 9 1 1 9 9 9

输出:

80

  • 定义:

有效子矩形: 内部(不包含边界)没有障碍点的子矩形(四边均与坐标轴平行)

极大有效子矩形:不被任何一个有效子矩形包含(除本身)

最大有效子矩形:最大的有效子矩形

  • 小性质 :

1. 极大有效子矩形的四条边无法向四边拓展, 也就是说四条边都存在障碍点或与大矩形边界重合

2.存在一个障碍点的矩形中最大有效子矩形一定是极大有效子矩形

  • 【证明】:若最大有效子矩形不是极大有效子矩形,那么一定存在一个有效子矩形包括它,这与它的最大性相违背

     

  • 解决问题:

1.思想一:枚举所有的极大有效子矩形

2.思想二:垂线法(后文介绍)

算法一 O(​S2):

由思想一我们可以得知,我们要枚举极大有效子矩形,尽量不枚举无效的,不是极大的子矩形

而由性质一得知,极大子矩形边界中必含障碍点

所以我们将所有障碍点按横坐标排序, 枚举障碍点所在纵线(与y轴平行的线)为极大有效子矩形的左边界(关于左边界是矩形边界下文讨论),再从左到右的扫描障碍点,更新答案后再更新上下边界

  • 更新答案:ans = max ( (上边界 - 下边界)* 横坐标之差 , ans)

  • 边界初始化:up = 0, down = 矩形纵长

  • 更新边界: 如果新点在左边界点的上方,up = min(up, 其纵坐标);否则 down = max(down, 其纵坐标);

  • bug & 改bug :

bug在于枚举过程中忽略了两类情况,一种是左边界在矩形左边界或右边界在矩形右边界的极大有效子矩形,另一种是左右边界都在矩形边界上(王知昆大佬的分类)。解决方法:将大矩形的四个顶点加入点集,然后横坐标排序跑一遍,纵坐标排序再跑一遍。横坐标跑的时候可以解决右边界问题,纵坐标跑时可以解决剩下问题(就像跑横坐标时可以解决上边界与下边界问题一样)

最后贴一下代码:

#include
#include
#include
#include
using namespace std; const int N = 6005; struct node{ int x, y; }a[N]; int L, W; bool cmp1(node i,node j) { return i.x < j.x; } bool cmp2(node i,node j) { return i.y < j.y; } int n; int main() { cin >> L >> W >> n; for (int i = 1;i <= n; i++) scanf ("%d %d", &a[i].x, &a[i].y); a[n+1].y = a[n+1].x = a[n+2].x = a[n+3].y = 0; a[n+2].y = a[n+4].y = W; a[n+3].x = a[n+4].x = L; n += 4; //加入矩形的四个顶点 sort(a + 1, a + n + 1, cmp1); int ans = 0, up, down, v; for (int i = 1;i <= n; i++) { up = 0, down = W, v = L - a[i].x; for (int j = i + 1;j <= n; j++) { if (v * (down - up) <= ans) break; //剪枝

转载于:https://www.cnblogs.com/Hs-black/p/11207152.html

你可能感兴趣的文章
Spring理解?
查看>>
删除无限循环的文件夹-删除递归文件夹
查看>>
Test
查看>>
C# 整理
查看>>
AngularJS中使用$resource
查看>>
[poj3261]Milk Patterns(后缀数组)
查看>>
[luogu3369]普通平衡树(fhq-treap模板)
查看>>
题解 P2799 【国王的魔镜】
查看>>
写写代码,注意注意细节
查看>>
css Backgroud-clip (文字颜色渐变)
查看>>
安装 OpenSSL 工具
查看>>
用长微博工具发布长微博
查看>>
大庆金桥帆软报表案例
查看>>
方维分享系统,个人中心杂志社显示我的、关注的、推荐的数量
查看>>
JavaScript BOM加载事件
查看>>
Java复习总结——详细理解Java反射机制
查看>>
Navicat for MySQL10.1.7注册码
查看>>
Proxy模式
查看>>
读书多些会怎样
查看>>
浏览器好用的技术
查看>>