zoukankan      html  css  js  c++  java
  • 最大子矩形问题学习笔记

    问题概述

    给定一个矩形网格, 网格上有一些障碍点, 要求出网格中不包含任何障碍点且边界与坐标轴平行的最大子矩形.

    一些定义

    有效子矩形: 内部不包含任何障碍点且边界与坐标轴平行的矩形.

    极大有效子矩形: 我们称一个有效子矩形为极大有效子矩形, 当且仅当不存在包含它的有效子矩形.

    最大有效子矩形: 所欲有效子矩形中面积最大的一个. 简称为最大子矩形.

    约定矩形的大小为(n imes m), 其中障碍格子的数量为(s).

    单调队列法

    时间复杂度为(O(s^2)), 此处不作详述.

    悬线法

    定义

    有效竖线: 除了两个端点以外, 不覆盖任何障碍点的竖直线段.

    悬线: 上端覆盖了一个障碍点或达到矩形上端的有效竖线.

    注意到, 矩形上的任意一点唯一地对应一条悬线的下端, 因而一个矩形中的不同悬线条数为(O(nm))的.

    实现

    我们注意到, 假如将最大子矩形剖开为若干条平行于Y轴的线段, 则至少有一条线段是悬线, 因此考虑枚举每一条悬线, 计算出其向左向右扩展得到的最大面积, 即可得到最大子矩形. 又由于悬线数量为(O(nm)), 因此我们只要(O(1))向左右两边扩展, 即可以(O(nm))的优秀时间复杂度解决问题.

    预处理出每一个位置的左边第一个障碍和右边第一个障碍即可, 即可做到(O(1))扩展.

  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/ZeonfaiHo/p/7685767.html
Copyright © 2011-2022 走看看