题意:
一列格子涂色,有三种颜色可以选择,但是要求相邻格子颜色不能相同,首尾颜色不能相同。求涂N个格子最多有多少种选择。
思路:
虽然这道题以前做过但是还是第一眼想不到思路。。。其实很简单,模拟一下就好了。
模拟出前三个:
1:1, 2, 3
2:12,13,21,23,31,32
3:123,132,231,213,312,321
当需要放第4个的时候有两种情况:
1. 第3个格子颜色与第1个不相同,即上面第3种情况的个数,这时第4个格子只有一种选择;
2. 第3个格子颜色与第1个不相同,即上面第2种情况(后面填上一个与第1个格子相同的颜色),这时第4个格子有两种选择;
所以我们得到递推式:a[n]=a[n-1]+a[n-2]*2;(n>3)
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 55
#define LL long long
using namespace std;
int N;
LL res;
LL save[MAX];
void dfs(int pos);
int main()
{
save[1] = 3;
save[2] = 6;
save[3] = 6;
for( int i = 4; i <= 50; i++ ){
save[i] = save[i-1] + 2*save[i-2];
}
while( scanf("%d",&N)!=EOF ){
printf("%I64d\n",save[N]);
}
return 0;
}