固定楼层算法

时间:2015-04-17 10:23:38

标签: algorithm

好的,我有这个任务:John的浴室地板坏了。我们有一张这个楼层的地图,其中'。'是好板,'+'是坏板,例如:

.+++
.+.+

这里有5个破碎的盘子和3个好的盘子。有两种板材,在商店出售:1x1板和2x1板。 1x1板材成本A和2x1板材成本B.任务是:给出地板图,计算地板固定的最低价格。

以上面的例子为例:我们可以放置2个2x1板和1个1x1板。因此价格 A + 2 * B

我有一个想法:每个断板计数最大连接断板长度。然后价格长度/ 2 * B +长度%2 * A 。< / p>

问题是,我真的不知道该怎么做。我对一些递归算法有所了解,但是有很多像那么的问题,比如圈子:

+++
+.+
+++

所以我有两个问题:

  1. 我正朝着正确的方向前进吗?
  2. 你能给我一些关于实现这个算法的提示吗?
  3. 谢谢!

    修改

    当2 * A <2时,存在微不足道的情况。 B,但让我们谈谈非平凡=)

    / EDIT

2 个答案:

答案 0 :(得分:4)

经典拼贴问题。这是一个加权的精确封面,在非平凡的情况下(当使用两个1x1瓷砖比使用一个1x2瓷砖花费更多时)我会使用ZDD来解决它。查看The Art of Computer Programming V4 1B中的示例(棋盘上的多米诺骨牌)。

有可用的库(例如CUDD),因此您不必从头开始实现ZDD,但这也不是太难。

作为奖励,您还可以获得通常不由其他算法提供的其他信息,例如有效倾斜的数量而不是全部枚举。它也很容易推广到其他尺寸/形状的瓷砖(3x1,2x2,L片等)。

答案 1 :(得分:3)

如果2 * A <= B然后这是微不足道的,只需用1x1s覆盖所有内容。

在相反的情况下,你必须最大化2x1s的数量。瓷砖正好是2x1这一事实使得它比一般的平铺问题更容易。特别是,这相当于在二分图中找到最大基数匹配,请参阅my answer here

一旦找到2x1的最大配置,您只需要用1x1s覆盖其余的瓷砖。