Algorithm 建造2^n高塔架的可能性,其2x2底座为2x1x1砌块
有多少种可能性可以用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艺术中): 因此: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) 这是因为如果你从一个平坦的底座开始,有两种
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)