看到一道小球问题,也有类似的染色问题,但是后面这个没有数量要求,用dp可以解决。
题目:
现在共有a个红球,b个蓝色球,c个绿球,要求相邻的球颜色不同(相同颜色的球不做区分,例如红色的表示都一样),共有多少种摆法
思路
一开始觉得可以用dp做,然而dp的base状态初始化实在是太难了(所有abs[a-b] == 1的情况都要初始化为1,不然就会漏算),递归大法好。
int ans;
void compute(int color, int a, int b, int c)
{
if (a == 0 && b == 0 && c == 0)
{
ans++;
return ;
}
if (color == 0)
{
if (b) compute(1, a, b - 1, c);
if (c) compute(2, a, b, c - 1);
}
else if (color == 1)
{
if (a) compute(0, a - 1, b, c);
if (c) compute(2, a, b, c - 1);
}
else if (color == 2)
{
if (a) compute(0, a - 1, b, c);
if (b) compute(1, a, b - 1, c);
}
}
void ball2()
{
ans = 0;
int A = 3, B = 4, C = 5;
compute(0, A-1, B, C);
compute(1, A, B-1, C);
compute(2, A, B, C-1);
cout << ans << endl;
}
int main()
{
ball2();
return 0;
}