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

    问题概述

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

    一些定义

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

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

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

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

    单调队列法

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

    悬线法

    定义

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

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

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

    实现

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

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

  • 相关阅读:
    关于控制地址控件的代码
    获取某个设计项列表界面上查询框中的值的代码
    js中不同值的替换
    js截取字符串方法实例
    抛异常语句的种类及区别
    从获取结果中去除重复记录
    泛微E8升级E9代码修改
    中控考勤数据转换
    WEB打印,分页首行自动带出栏目标题
    VS附加进程调试IIS网站
  • 原文地址:https://www.cnblogs.com/ZeonfaiHo/p/7685767.html
Copyright © 2011-2022 走看看