我正在尝试解决以下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
我试图找到重复模式,或者通过高度或宽度来扩展它。为了找到H = 3&的值。 W = 3或H = 2& W = 4。
关于如何通过身高或体重来计算增长的任何输入? 附:墙总是H * W * 1.
答案 0 :(得分:9)
首先,让我们看看如果我们忽视了保持连接的必要性,我们可以建造多少M * N墙:
我们可以单独处理每一行,然后将计数相乘,因为它们是独立的。
只有一种方法可以平铺0*1
或1*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垂直位置处最左边的断裂的非实心壁的数量。第一个因素是固体墙的数量 - 以消除重复变体的计数。