【问题标题】:Maximum Area of rectangle without any monsters没有怪物的矩形最大面积
【发布时间】:2014-01-05 18:43:36
【问题描述】:

给定一个 N*M(基于 1 的索引)的矩形网格,其中它们是 k 个不同单元格上的 k 个怪物。现在我们需要回答 Q 个查询,其中我们将获得最低行号 (L) 和最高行number(H) 我们需要告诉那些没有怪物的行之间矩形的最大面积。(这里的矩形面积仅表示单元格的数量)

示例:假设我们有一个 4 * 5 的网格(平均 n=4 和 m=5),怪物位于 7(=k) 个单元格上,即 (1,3) , (1,4) , ( 2,1) , (2,4) , (3,2) , (4,1) , (4,2) 让我们有 1 个查询,其中 L=3 和 H=4 那么这里的最大面积是 6 .

现在如果查询非常大,比如 10^6。那么如何解决这个问题。他们有什么动态方法吗?

这里红色方块代表怪物,紫色方块代表解法

【问题讨论】:

  • 怪物无处不在!
  • @P0W 我不明白你想说什么。在解决方案矩形中,我们可以看到他们不是怪物
  • P0W 只是在开玩笑,请忽略 P0W。
  • @user3086701 请删除该问题,因为它与 codechef 正在进行的长期竞赛 codechef.com/JAN14/problems/METEORAK 中的问题相同。我不怪你作弊
  • @VikramBhat:不。好吧,也许有点。我认为这个问题是关于角色扮演游戏的,一个典型的新手编程练习。 (您必须将 OP 归功于很好地掩盖了这个问题。)无论如何,有效算法的问题还没有在这里得到解决,人们似乎对这个问题失去了兴趣。没有难过的感觉。

标签: algorithm dynamic-programming


【解决方案1】:

这是一个递归解决方案,适用于任意大小的地下城和相对较少的怪物。

如果地牢(n,w,s,e)中有一个怪物(x,y),有两种情况。案例1是微不足道的:怪物在地牢外面。那么最大的矩形就是地牢。 (地下城总是长方形的,对吧?)。

在情况 2 中,最大矩形是怪物的北、西、南或东矩形之一:

NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
NNNNNNNNNN    ....EEEEEE    ..........    WWW.......
...@......    ...@EEEEEE    ...@......    WWW@......
..........    ....EEEEEE    SSSSSSSSSS    WWW.......
..........    ....EEEEEE    SSSSSSSSSS    WWW.......
..........    ....EEEEEE    SSSSSSSSSS    WWW.......

现在递归地将此推理应用于您的怪物位置列表并跟踪迄今为止的最大值。这是一些伪代码:

max_area = 0
max_rect = Null

sub find_max_rect(Dungeon, Monsters)

    if area(Dunegon) <= max_area: 
        return                      # save time for small dungeons

    if Monsters is empty:
        if area(Dungeon) > max:
            max_rect = Dungeon
            max_area = area(Dungeon)

    else
        M = Monsters.pop()          # Remove head from list

        if M in Dungeon:
            find_max_rect(Subrect(Dungeon, M, North), Monsters)
            find_max_rect(Subrect(Dungeon, M, East), Monsters)
            find_max_rect(Subrect(Dungeon, M, South), Monsters)
            find_max_rect(Subrect(Dungeon, M, West), Monsters)
        else:
            find_max_rect(Dungeon, Monsters)

注意:我实际上在上面的草图中犯了一个明显的错误:@ 当然代表玩家而不是怪物。

【讨论】:

  • @M Ohem 他们没有任何动态方法来做同样的事情吗?我知道一个 O(n^4) 解决方案。但它会非常慢,因为 N,M 可以达到 1000。我在问因为查询的数量可能非常大,一次又一次地解决它并不是那么有效
  • @MOehm 这是正在进行的编码比赛的问题,请删除答案
  • @VikramBhat:警察,你是谁?我会保留我的答案。我认为这是一个有趣的问题,我花了一些时间用一些测试用例实现示例解决方案并写下答案。在发布答案之前,我不会检查破坏比赛的可能性。指出这一点不是 OP 的任务吗? (另外:太阳底下并没有什么新鲜事。我很确定网上已经有这个或类似问题的答案。你也想删除这些解决方案吗?)
  • @user3086701:我的方法为何如此“静态”?您是否真的阅读并试图理解我的回答? “比赛场地”可以随心所欲,因为它不是像素图,而只是一组四个维度:南北y以及西和东 x 坐标。该算法的定义维度是怪物的数量。但即便如此,随着子矩形变小,包含怪物的可能性也会降低,我预计算法会相当快。
  • @MOehm 我发现为每个查询一次又一次地计算结果没有用。如果它们是 10^6 个查询。那么我是否需要一直计算它。我想我们可以在 start 本身中预先计算所有结果
【解决方案2】:

你知道最大矩阵和问题吗?这个问题可以使用动态规划在 O(n^3) 时间内解决。

您的问题与此非常相似。您需要为每个空网格值分配 1 和每个怪物网格值 -INF。然后在你应用最大矩阵和解之后,你得到了最大面积。

【讨论】:

  • 如何解决这个问题?你能帮忙吗
  • 例如,在您的示例中,地图变为 ((1,1,-INF,-INF,1),(-INF,1,1,-INF,1),(1, -INF,1,1,1),(-INF,-INF,1,1,1))。然后你可以应用最大矩阵和解。
  • @songlj 删除答案,因为它是来自 ongiong 编程竞赛的问题
  • @VikramBhat 哪个比赛?
  • @VikramBhat 即使是来自比赛,你也不应该对我的回答投反对票。
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 2012-10-17
  • 1970-01-01
  • 2019-07-24
  • 2015-04-14
相关资源
最近更新 更多