给定一个N * M(基于1的索引)的矩形网格,其中它们是k个不同单元格上的k个怪物。现在我们需要回答Q查询,其中我们将得到最低行数(L)和最高行数字(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.然后如何解决这个问题。这是他们的任何动态方法还是这样做?
这里红色方块表示怪物,紫色方块表示解决方案矩形
答案 0 :(得分:1)
这是一个递归解决方案,适用于任意大小的地下城和相对较少的怪物。
如果地牢中有一个怪物(x,y)(n,w,s,e),则有两种情况。案例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)
注意:我在上面的草图中实际上犯了一个明显的错误:@
当然代表玩家而不是怪物。
答案 1 :(得分:0)
你知道最大矩阵和问题吗?使用动态编程可以在O(n ^ 3)时间内解决该问题。
你的问题非常类似。你需要的是分配每个空网格值1和每个怪物网格值-INF。然后在应用最大矩阵求和解后,得到最大面积。