【发布时间】:2013-03-03 17:27:07
【问题描述】:
我正在尝试解决以下 DP 问题:
您有 4 种类型的乐高积木,尺寸分别为 1 * 1 * 1、1 * 1 * 2、1 * 1 * 3 和 1 * 1 * 4。假设您有无限数量的每种类型的块。
你想用这些块做一堵高 H 宽 M 的墙。 墙上不应该有任何洞。你建造的墙应该是 一个坚固的结构。坚固的结构意味着它不应该 可以沿任何垂直线分隔墙壁而无需切割 任何用于建造墙壁的乐高积木。方块只能放置 水平。墙可以用多少种方式建造?
这是我尝试的方式: 用 a b c d 表示 1 * 1 * 1、1 * 1 * 2、1 * 1 * 3 和 1 * 1 * 4 块 .有效模式以粗体表示。无效的模式是可以被垂直线打破的。
H=1 & W=3 #valid pattern=1
aa ab ba cH=2 & W=3 #有效模式=9
我正在尝试查找重复模式以将其扩展高度或宽度。即找到 H=3 & W=3 或 H=2&W=4 的值。
关于如何通过身高或体重来计算增长的任何意见?
附:墙总是 H*W*1。
【问题讨论】:
-
澄清:墙是
M*H*1块,还是M*H*inf块?我假设前者(这样模式的数量是有限的),但是我看不出你的模式符号是如何工作的。 1x3 的唯一有效模式是c,而不是b。 -
我能想到的最好的是带有
O(4^H)状态的马尔可夫链。这不好(或者是吗?)。 -
这听起来更像是托盘装载问题,是NP-Complete。我认为我们不会在多项式时间内找到精确的解决方案。
-
@JanDvorak:感谢您的指出。那是个大错误。让我编辑我的 Q
-
@SauceMaster 这种情况更容易,因为您事先知道托盘尺寸,并且所有托盘都是矩形和相同尺寸的倍数(并且不能旋转)。这也更加困难,因为您需要使墙壁物理连接。
标签: algorithm dynamic-programming