有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;
}
答案 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。