1 2
3 6
#include <stdio.h>
int main()
{
int a;
//一定要用long long类型,或者__int64,不然int类型装不下
__int64 c[51];
//c[0]是C(3,1)=3,数列的写法,从三个里面选一个
//c[1]是C(3,1)*C(2,1)=6,数列的写法,从两个个里面选一个
//c[2]是C(3,1)*C(2,1)*C(1,1)=6,数列的写法,从一个里面选一个
c[0] = 3; c[1] = 6; c[2] = 6;
//如果N>3,那么从第三个开始的每一个的前n-1个都有两种情况
//1. 前n-1个与第一个相同
// 那么,由于前n-2个都是符合要求的(相邻颜色各不相同),所以第n个
// 有两种选法,那么总共有 2*c[i-2]种
//2. 前n-1个与第一个不相同
// 那么,第n个的颜色就已经确定了(因为只有三种颜色,且其中两种颜色被第一个格子和第n-1个格子占了)
// 所以,这种情况下总共有 c[i-1]种
//两个相加,就是当前的种数(注意是n>3时)
for (int i=3; i<51; i++)
{
c[i] = c[i-1] + 2*c[i-2];
}
while(scanf("%d", &a)!=EOF)
{
printf("%I64d\n", c[a-1]);
}
return 0;
}
HDU 2045 不容易系列之(3)—— LELE的RPG难题
原文:http://blog.csdn.net/a237653639/article/details/46411019