锻炼 - 猫在大厅里

时间:2016-01-16 12:01:10

标签: algorithm

  

n长的大厅里有许多老鼠。给出长度为n的阵列,其中a [i]描述了大厅的第i和第i + 1米之间的小鼠数。

     

你有k只猫。每只猫都可以保护大厅的连接片段。被保护的段可能不相交。某些细分可能无人看守。

     

如果一只猫守卫从大厅的第i到第j米的一段,其中s = a [i] + a [i + 1] + ... + a [j-1]只老鼠驻留,它将捕获max(s-(ji-1)^ 2,0)小鼠。

     

可以捕获的最大鼠标数量是多少?

我怀疑该算法应该使用动态编程,但我不知道如何解决它。

我没有任何代码,因为我还没有任何算法(我尝试创建它),但到目前为止我的想法。

我们不能使用感应wrt来计算猫的数量。这可能会产生错误的结果。例如,如果有一个猫可以捕获7只小鼠的一个区段和两只猫可以捕获2只小鼠的不相交的位置,那么我们将从一只猫的结果中得不到任何结果。

所以我们应该解决子段的问题,并从子段的答案中计算出答案。

但我不知道如何继续前进。

2 个答案:

答案 0 :(得分:1)

猫比保护更大的区域更有效地保护较小的区域。

证明: 如果我> Ĵ | J-I-1 | < | J-11 | => (j-i-1)^ 2< (j-i)^ 2 => s-(j-i-1)^ 2> max(s-(j-i)^ 2,0)=> max(s-(j-i-1)^ 2,0)> = max(s-(j-i)^ 2,0)=> max(s-(j-i-1)^ 2,0)> = max(s - ((j + j') - i-1)^ 2,0} => 猫在较小的区域更有效。

由于猫在较小的区域有效,如果我们使用更多的猫,那么猫平均会保护较小的区域,所以,如果我们使用更多的猫,我们可以更有效地安排猫

这意味着应该使用所有k只猫。有了这个,我们已经排除了所有使用猫的情况。好的,除了猫的数量多于米的情况,但这是一个微不足道的情况,当你应该用一只猫/米来保护它。

所以,当k <= n时,我们使用所有的猫。因此问题在于划分。您希望找到最佳分区,并使用公式描述的启发式。 这与国际象棋非常相似。

说明:在国际象棋中,你有一个起始位置。您希望找到最佳移动,因此您需要计算其主要变化,并将次优的变化计算为最大深度。在您的问题中,您需要找到正确的移动(将猫定位到给定的扇区),就像在国际象棋中一样,但具有不同的启发式。启发式应该是基于深度(已经定位的猫的数量)和有效性(可能捕获的小鼠数量/完全覆盖区域中的小鼠数量)的基础。

例如,Alpha-Beta pruning相对容易实现,根据this post,在最佳情况下它的复杂度为O(b ^(d / 2))。你可以在这里做further reading

编辑:虽然问题可以通过Alpha-Beta修剪轻松解决,但RBarryYoung在他的评论中是正确的,可以在没有像对手移动的游戏那样建模的情况下解决问题,同时对此进行建模是可能的,因为最负面的答案&#34;可以看作唯一的答案,它增加了所需分区的数量,减少了可以使用的猫的数量。

答案 1 :(得分:1)

我首先要生成猫的所有可能的单个位置(放置由1m段覆盖的集合定义,例如从3米开始并且距离那里2米),计算它们各自的值(小鼠数量)陷入相应的段),然后找到k(猫的数量)这样的位置的选择,以便放置不重叠并且值最大化。由于可以在给定两个段的情况下轻松检查重叠,因此您不必构建查找表。

正如Lajos-Arpad在他的回答中指出的那样,使用你所拥有的所有猫总是更好,因为对于更宽的范围/更长的段,会有惩罚。当您可以使用另一只猫将范围拆分为两个时,总值会增加。

优化:

  • 消除跨越太多列的展示位置。示例:如果您的大厅长4米且您有3只猫,则不要将猫放在3米范围内。

  • 删除其他展示位置占主导地位的展示位置。如果展示位置A跨越展示位置B所跨的列的超集,但不会产生更多鼠标,则忽略A.这可以显着减少可能展示位置的数量。

实现:这种形式的问题非常适合0-1整数线性编程。要找到的向量x具有长度p(放置的数量)并且在每个位置包含1或0,这取决于放置是否在解决方案中。解决方案的价值通常由展示位置的值之和给出。约束:1的数量是&lt; = k,并且您的大厅中的每个仪表都有一个约束,可以防止选择覆盖相应仪表的两个位置。

另一种选择是你列举所有可能的展示位置组合并选择最好的组合(蛮力)。你当然可以进一步优化它。例如,您可以先对展示位置进行排序,然后选择最有价值的展示位置。到目前为止跟踪最佳解决方案,并在您看到当前最佳解决方案无法在此分支中下注时停止生成子选择。

示例:您已经选择了2个总价值为30的展示位置,并且您将使用以下值从10个展示位置中选择3个展示位置:

17,18,8,4,4,3,2,1,1,1

如果您当前的最佳解决方案的值为70,则可以在此处停止并回溯。无论你选择哪三个位置,你都不会增加超过35的值(前三个的总和),但你需要至少41个。