乐高积木 - 动态规划

时间:2013-03-15 04:47:04

标签: algorithm dynamic-programming

我正在尝试解决以下DP问题:

  

您有4种类型的乐高积木,尺寸为1 * 1 * 1,1 * 1 * 2,1 * 1   * 3和1 * 1 * 4.假设每种类型都有无限数量的块。

     

您想要在这些块中制作高度为H且宽度为M的墙。   墙上不应有任何孔。你建造的墙应该是   一个坚固的结构。坚固的结构意味着它不应该   可以沿任何垂直线分开墙壁而不切割   任何用于建造墙壁的乐高积木。只能放置块   水平。墙可以建造多少种方式?

以下是我的尝试方式: 用b c d表示1 * 1 * 1,1 * 1 * 2,1 * 1 * 3和1 * 1 * 4块 。有效模式以粗体表示。无效的模式可以被垂直线打破。

  

H = 1& W = 3 #valid pattern = 1
a a ab ba c

     

H = 2& W = 3 #valid pattern = 9
  enter image description here

我试图找到重复模式,或者通过高度或宽度来扩展它。为了找到H = 3&的值。 W = 3或H = 2& W = 4。

关于如何通过身高或体重来计算增长的任何输入? 附:墙总是H * W * 1.

2 个答案:

答案 0 :(得分:9)

首先,让我们看看如果我们忽视了保持连接的必要性,我们可以建造多少M * N墙:

我们可以单独处理每一行,然后将计数相乘,因为它们是独立的。

只有一种方法可以平铺0*11*1墙,而平铺n*1的方法数量是平铺{{}的方式总数1}} ... {n-1}*1 - 大小的墙,原因是这些墙可以通过移除{n-4}*1墙的最后一块瓷砖来获得。

这产生了一个tetranacci序列OEIS A000078。 所有n*1墙的数量均为W*H

现在,计算实心墙的数量。 MBo的答案已经包含了基本前提:

分支在未连接墙的最左侧的地方。 a(w,h)=T(w)^h l * W * H墙的数量是A橄榄X * H墙的数量乘以S ll A墙的数量,总计所有可能的值{W-X}*H,加上X ol * W * H墙的数量:

S

作为最后一步,我们将A(W,H) = sum{X=1..{W-1}}(S(X,H)*A(W-X,H)) + S(W,H) 术语分开,这是我们想要计算的值,并重复以前的公式:

S(M,H)

(证明MBo的公式正确)。

这还提供了S(W,H) = A(W,H) - sum_x( S(X,H)*A(W-X,H) ) //implicitly, S(1,H)=1 A(W,H) = T(W)^H T(X) = X > 0: T(X-1)+T(X-2)+T(X-3)+T(X-4) X = 0: 1 X < 0: 0 算法来计算O(W^2)(假设正确的记忆和恒定时间算术运算)

答案 1 :(得分:7)

不难发现多个1xW条纹(让它为N(1,W))。 然后你可以找到许多(包括非固体)HxW墙 - 它是A(H,W)= N(1,W)^ H 任何非实心墙都由左H * L墙和右H *(W-L)墙组成。似乎固体墙的数量是

S(H,W) = A(H,W) - Sum(S(H, L) * A(H, W-L)) [L=1..W-1]

S(H,L)* A(H,W-L)是在L垂直位置处最左边的断裂的非实心壁的数量。第一个因素是固体墙的数量 - 以消除重复变体的计数。