博客
关于我
POJ 2019 Cornfields (二维RMQ)
阅读量:793 次
发布时间:2023-03-03

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

为了帮助 FJ 找到最佳位置放置他的玉米田,需要解决多个查询,每个查询要求在一个 B x B 的子矩阵中找到最大和最小的海拔值。为了高效处理这些查询,通常采用二维范围查询(2D RMQ)算法。

优化后的代码解释

代码使用动态规划预处理矩阵,建立三个三维数组 dpmindpmaxval,分别存储不同块的最小值、最大值和原始值。预处理过程分为几个步骤:

  • 初始化:将所有单元格的 val 值直接赋给 dpmindpmax

  • 计算块大小:通过 mm 数组记录每行和每列的最大块大小。mm[i] 表示第 i 行的最大块大小,mm[j] 表示第 j 列的最大块大小。

  • 预处理动态规划表:从小块到大块逐步构建。对于每个块大小 iijj,从 1 到最大块大小:

    • 对于每个行和列,计算当前块的最小值和最大值。
    • 如果当前块大小大于 1,则更新更大的块的最小和最大值。
  • 查询过程

  • 查询最大值rmq1 函数接受矩形区域的四个顶点,计算所需块的大小 k1k2,然后从预处理表中获取最大值。

  • 查询最小值rmq2 函数同样接受四个顶点,使用预处理表获取最小值。

  • 代码改进

    • 变量命名统一:确保所有变量名清晰,避免混淆。
    • 错误处理:在读取输入时添加错误检查,确保输入有效。
    • 优化预处理:优化动态规划表的构建逻辑,确保预处理时间复杂度为 O(N log N)。
    • 减少内存占用:使用适当的数据结构和优化,降低内存使用,避免内存溢出。

    总结

    通过动态规划预处理,实现了高效的二维范围查询。每个查询的时间复杂度为 O(1),预处理时间复杂度为 O(N log N)。这种方法在处理大量查询时表现优异,能够快速响应用户需求。

    转载地址:http://euxfk.baihongyu.com/

    你可能感兴趣的文章
    Plotly:如何结合 make_subplots() 和 ff.create_distplot()?
    查看>>
    Plotly:如何绘制累积的“步骤“;直方图?
    查看>>
    Quartz进一步学习与使用
    查看>>
    Plotly条形图-根据正/负值更改颜色-python
    查看>>
    PLSQL developer12安装图解
    查看>>
    PLSQL Developer调试 存储过程和触发器
    查看>>
    PLSQL window操作
    查看>>
    plsql 存储过程 测试
    查看>>
    plsql 安装后database下拉没有东西
    查看>>
    PLSQL_Oracle PLSQL内置函数大全(概念)
    查看>>
    PLSQL_案例优化系列_体验逻辑结构如何影响SQL优化(案例3)
    查看>>
    PLSQL中INDEX BY TABLE的 DELETE操作
    查看>>
    plsql学习笔记---plsql相关概念,以及基础结构
    查看>>
    plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致
    查看>>
    plsql查询乱码问题解决
    查看>>
    PLSQL的DBMS_GETLINE
    查看>>
    quartz简单demo,教你最快使用quartz
    查看>>
    PlutoSDR学习笔记(一)—函数API手册
    查看>>
    Quartz安装包中的15个example
    查看>>
    Quartz学习总结(2)——定时任务框架Quartz详解
    查看>>