着色网格的方式数量

时间:2013-10-10 11:43:23

标签: algorithm permutation

有n x 1的网格。你必须用至少r个红色细胞,至少g个绿色细胞,至少b个蓝色细胞着色。 (n + r + g <= n)。如果它们在至少一个位置上不同,则认为两种模式是不同的。你可以用多少种方式给它上色。 (解决方案可以是算法或数学)。

我的尝试:

enter code here
int func(int id, int r, int g, int b)
{
     int ma = 0;
     if (id == n) {
        if (r > 0)
            ma++;
        if (g > 0)
             ma++;
        if (b > 0)
             ma++;
        return ma;
     }
     if (r > 0)
       ma += func(r-1, g, b, id + 1);
     if (g > 0)
       ma += func(r, g-1, b, id + 1);
     if (b > 0)
        ma += func(r, g, b-1, id + 1);

    if (r + g + b < n - id)  {
           ma += func(r, g, b, id + 1);
    }

    return ma;

}

1 个答案:

答案 0 :(得分:0)

假设它们的数量是f(n,r,g,b),那么我们有以下递归:

f(n,r,g,b) = f(n-1,r,g,b)*3 + f(n-1,r-1,g,b)+f(n-1,r,g-1,b)+f(n-1,r,g,b-1)

我们也知道基本情况:f(1,1,0,0)=f(1,0,1,0)=f(1,0,0,1)=1。从底部开始,通过上面的递归建立f(n,r,g,b)。 (如果使用memoization而不是for循环,则很简单)。运行时间为O(n*r*g*b)

更新:您的代码接近我的回答但首先我应该说它是错的,其次,您使用了导致指数运行时间的天真递归,分配了一个大小为n 的数组r g * b,以防止重新计算已计算的答案。有关记忆的实例,请参阅this