可以用 2x1x1 块的 2x2 底座构建 2^n 高的塔

Possibilities to construct 2^n height tower with 2x2 base of 2x1x1 blocks

建造 2x1x1 块的 2^n 塔(底面积为 2x2)有多少种可能性?到目前为止,这必须是一种分而治之的算法。我想出了 O(2^n),但我想在多项式时间内解决这个问题。

我的主要问题是弄清楚“征服”部分。

有人可以告诉我如何在多项式时间内解决这个问题吗?

Example

设 F(n) 是从平坦的底座建造高度为 n 的塔的方法数,S(n) 是从底座建造高度为 n 的塔的方法数,其中一半是填写.

则F(n) = 2F(n-1) + 4S(n-1), S(n) = F(n-1) + S(n-1).

那是因为如果您从平底开始,有两种方法可以完全填充底层而没有任何小块粘起,还有 4 种方法可以将一块放平,两块粘在上面。类似地,如果你有一个半填充的底座,你可以通过添加一个躺着的块来完成这一层,或者添加两个更多的粘贴块,其中一半填充上面的层。

然后,您可以将其表示为矩阵向量乘法(在 ASCII 艺术中):

F(n) = (2 4) (F(n-1))
S(n) = (1 1) (S(n-1))

等等:

F(n) = (2 4)^n (F(0))
S(n) = (1 1)   (S(0))

由于 F(0) = 1 且 S(0) = 0,您有:

F(n) = (2 4)^n (1)
S(n) = (1 1)   (0)

您可以使用平方求幂在 O(log n) 时间内计算矩阵幂。这为您提供了一个 O(n) 算法,用于查找构建 2^n 高塔的方法。

另一种(分而治之)方法是计算建造高度为 2^n 的塔的方法,其中底层是完整的或垂直的半填充,或水平的半填充。然后,您可以通过计算将 9 个不同的半塔中的两个组合在一起的方式,每次将问题减半。虽然计算起来更复杂,但仍然是 O(n),因为您不能使用矩阵幂技巧,因为会出现一些平方项。