1 2
3 6
题意:用红、粉、绿三种颜色给排成一行的n个格子涂色,要求任何相邻的格子不能同色,首位两格也不能同色,问有多少种涂色的方法
解题思路:因为任何相邻的格子都不能同色,所以除第一个格子有3种选择之外,其余的格子都只有两种选择
即
①第一个格子为红时,第二个格子可以为粉、绿
②第一个格子为粉时,第二个格子可以为红、绿
③第一个格子为绿时,第二个格子可以为红、粉
对应的,第n-1个格子,它有两种可能性,一种是它颜色与第1个格子颜色相同,这样第n个格子就有两种颜色可以选,方案数为s[n-2]*2;另一种则是它的颜色与第1个格子颜色不同,这样第n个格子的颜色就没得选了,方案数为s[n-1]
由此可得,n个格子涂色,涂色的方法有s[n]=s[n-1]+s[n-2]*2
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<map> #include<set> #include<stdlib.h> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 51; const int inf = 1000000000; const int mod = 2009; __int64 s[N]; int main() { int i,n; s[1]=3;s[2]=s[3]=6; for(i=4;i<N;i++) s[i]=s[i-1]+2*s[i-2]; while(~scanf("%d",&n)) printf("%I64d\n",s[n]); return 0; }菜鸟成长记