HDU 2045
•题意
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green) 三色涂每个格子;
每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色;
求全部的满足要求的涂法;
•题解(递推)
定义 $f[i]$ 表示 $i$ 个格子的总方案数;
假设 $f[1],f[2],\cdots ,f[i-1]$ 已经求出,如何求出 $f[i]$ 呢?
考虑到这一点 $i$ 与 $i-1$ 不同色,同时 $i$ 与 $1$ 也不同色;
$i$ 个格子的总方案数是不是可以分为以下两种:
① 第 $i-1$ 个格子与第 $1$ 个格子不同色
② 第 $i-1$ 个格子与第 $1$ 个格子同色
对于情况①,已知 $f[i-1]$ 求解的是 $i-1$ 与 $1$ 不同色的总方案数,所以,情况①的答案为 $f[i-1]$;
对于情况②,因为第 $i-1$ 个格子与第 $1$ 个格子同色,且第 $i-1$ 个格子与第 $i-2$ 个格子不同色;
也就是说,求解第 $i-1$ 个格子与第 $1$ 个格子同色的总方案数可以转化为求解第 $i-2$ 个格子与第 $1$ 个格子不同色的总方案数;
易得 $f[i-2]$ 就是解,又因为第 $i-1$ 个格子与第 $1$ 个格子同色,所以,第 $i$ 个格子有两种选择;
所以情况②的总方案数为 $2\times f[i-2]$;
所以,$f[i]=f[i-1]+2\times f[i-2]$;
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int N=60; 5 6 int n; 7 ll f[N]; 8 9 int main() 10 { 11 f[1]=3; 12 f[2]=f[3]=6; 13 for(int i=4;i < N;++i) 14 f[i]=f[i-1]+2*f[i-2]; 15 16 while(~scanf("%d",&n)) 17 printf("%lld\n",f[n]); 18 }