题意用3种颜色涂n个方块,相邻不能涂相同颜色,首尾不能相同,求用多少种涂法?
此题可推广至用k种颜色涂n个方块 递推公式n>=4时 f[n]=(k-2)*f[n-1]+(k-1)*f[n-2];
方法一:
若n-1颜色与1不同,第n块有k-2种涂法,则有f[n-1]*(k-2)种涂法;
若n-1颜色与1相同,则n-2与1颜色必不相同,第n块有k-1种涂法,即有f[n-2]*(k-1)种涂法;
所以一共有f[n]=(k-2)*f[n-1]+(k-1)*f[n-2]种涂法;
方法二:
利用全集减去补集的方法的思想,如果不需要首尾不同,则有k*(k-1)^(n-1)种方法;
其中包括首尾不同的f(n),也包括首尾不同的,而首尾相同的减去最后一格恰好是f(n-1);
所以f[n]=k*(k-1)^(n-1)-f[n-1];
代码如下:
#include<stdio.h>
int main()
{
long long a[51];
int i,n;
a[1]=3;
a[2]=6;
a[3]=6;
for(i=4;i<=50;i++)
a[i]=a[i-1]+2*a[i-2];
while(scanf("%d",&n)!=EOF)
{
printf("%I64d\n",a[n]);
}
return 0;
}