好的,我有这个任务:John的浴室地板坏了。我们有一张这个楼层的地图,其中'。'是好板,'+'是坏板,例如:
.+++
.+.+
这里有5个破碎的盘子和3个好的盘子。有两种板材,在商店出售:1x1板和2x1板。 1x1板材成本A和2x1板材成本B.任务是:给出地板图,计算地板固定的最低价格。
以上面的例子为例:我们可以放置2个2x1板和1个1x1板。因此价格 A + 2 * B 。
我有一个想法:每个断板计数最大连接断板长度。然后价格长度/ 2 * B +长度%2 * A 。< / p>
问题是,我真的不知道该怎么做。我对一些递归算法有所了解,但是有很多像那么的问题,比如圈子:
+++
+.+
+++
所以我有两个问题:
谢谢!
修改
当2 * A <2时,存在微不足道的情况。 B,但让我们谈谈非平凡=)
/ EDIT
答案 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覆盖其余的瓷砖。