题目链接:bnu4064
/* 首先不考虑对称,递推公式:f[n] = f[n-1] + 2*f[n-2]; 即n-1的情况加上一个竖条,n-2的情况加上一个2*2的或两个横条 接着考虑有多种是对称的,n为奇数时:s[n] = f[n/2]; n为偶数时:s[n] = f[n/2] + f[n/2-1]*2; 即(中间是一块2*2的,或两个横条,或没有); f[n] = 2*不对称的种数+s[n]; */ #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <cstdlib> using namespace std; int f[30] = {0,1,3}; int s[30] = {0,1,3}; int main() { int n,i,j; for(i = 3; i <= 28; i ++) { f[i] = f[i-1] + 2*f[i-2]; if(i&1) s[i] = f[i/2]; else s[i] = f[i/2] + f[i/2-1]*2; } int p = 1; while(scanf("%d",&n),n) { printf("Case %d:%d\n",p++,(f[n]+s[n])/2); } return 0; }
原文:http://blog.csdn.net/jzmzy/article/details/21116061