采访问:建造乐高积木塔的方法有多少?

时间:2013-12-15 02:12:00

标签: math dynamic-programming

found this problem online,但无法找到一个很好的解决方法:

给定一组高度分别为1,2,3和4的乐高积木,每个都有不同的颜色,编写一个程序来计算构建高度为n≥1的塔的方法数。

这似乎可以通过动态编程解决,但我对此缺乏经验 有没有解决这个问题的想法?

3 个答案:

答案 0 :(得分:1)

一种可能的解决方案类似于以下Python函数:

def lego(n):
    if n < 0:
        return 0 # invalid case
    elif n == 0:
        return 1 # solved case
    else:
        return lego(n-1) + lego(n-2) + lego(n-3) + lego(n-4)

但是,正如Oliver所指出的那样,除非你记忆(使用像functools.lru_cache这样的东西或者如果使用Python就创建自己的memoization装饰器),它将具有指数运行时间。

尽管如此,还有更好的方法可以做到这一点。例如,您可以执行类似于生成斐波纳契数的矩阵方法。

答案 1 :(得分:0)

因此算法:

  1. 放置一块大小为k的砖。
  2. 现在你遇到了建造一座大小为n-k的塔楼的问题。

答案 2 :(得分:0)

这个不错的算法可以通过简单的for循环完成,在圆形阵列上只能记住乐高塔尺寸的最后4个值。

int lego_tower(int n)
{
    int lego[4] = {1, 0, 0, 0}, i;

    for(i=1; i<=n; i++)
        lego[i&3] += lego[(i+1) & 3] + lego[(i+2) & 3] + lego[(i+3) & 4];

    return lego[n&3];
}

请注意i & 3i % 4相同,并且此i + 3为i-1(模4),i + 2为i-2,依此类推,因此您可以识别其他答案的递归公式:

  

lego_tower(n)== lego_tower(n-4)+ lego_tower(n-3)+ lego_tower(n-2)+ lego_tower(n-1)

初始化说,对于i = 0,你有1种方法来建造塔,所有其他方式(-1到-3)是不可能的,因此有0种方法可以建造塔。