Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 建造2^n高塔架的可能性,其2x2底座为2x1x1砌块_Algorithm_Sorting_Permutation_Tiling - Fatal编程技术网

Algorithm 建造2^n高塔架的可能性,其2x2底座为2x1x1砌块

Algorithm 建造2^n高塔架的可能性,其2x2底座为2x1x1砌块,algorithm,sorting,permutation,tiling,Algorithm,Sorting,Permutation,Tiling,有多少种可能性可以用2x1x1块建造一座2^n塔(基本面积为2x2)?这必须是一个分而治之的算法,正如我到目前为止所理解的那样。我算出了O(2^n),但我想用多项式时间来解决这个问题 在我的例子中,主要的问题是找出“征服”部分 谁能给我一个建议,如何在多项式时间内解决这个问题 设F(n)为从平底建造高度为n的塔的方式数,S(n)为从填充一半的底座建造高度为n的塔的方式数 然后F(n)=2F(n-1)+4S(n-1),S(n)=F(n-1)+S(n-1) 这是因为如果你从一个平坦的底座开始,有两种

有多少种可能性可以用2x1x1块建造一座2^n塔(基本面积为2x2)?这必须是一个分而治之的算法,正如我到目前为止所理解的那样。我算出了O(2^n),但我想用多项式时间来解决这个问题

在我的例子中,主要的问题是找出“征服”部分

谁能给我一个建议,如何在多项式时间内解决这个问题

设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)^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(logn)时间内的矩阵幂。这为您提供了一个O(n)算法,用于找到建造2^n高度塔楼的方法


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

似乎更容易使用DP,尽管看起来有相当多的手工计算和案例工作。是的,我也考虑了DP方法,而且我用DP部分解决了它。我的解决方案计算高度为1到2^(n-1)的塔的所有排列。但是2^n的高度需要分而治之,我想。我从来没有想过矩阵乘法方法。非常感谢。
F(n) = (2 4)^n (1)
S(n) = (1 1)   (0)