题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045
-----------------------------------------------------------------------------------
题意:3种颜色,方格涂色,从左到右,最后一个方格颜色不能和第一个方格颜色相等,相邻颜色不能相同。
思路:最开始思路想简单了,以为第一个方格3种颜色,第二个方格到倒数第二个方格都是2种选择,最后一个方格一种选择。但是,这种递推需要分奇偶进行讨论。对于第一个和最后一个方格都是相同颜色的情况,其实等同于k-1个方格的涂色情况的结果,所以只要将3*2^(N-1)的结果减去k-1的结果就是第k个方格的结果,由此递推可得到最终结果。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; ll f(int t){ if(t==1) return 3; if(t==2) return 6; else{ return 3*pow(2,t-1)-f(t-1); } } int main(void){ int n=0; while(~scanf("%d",&n)){ printf("%lld\n",f(n)); } return 0; }