题目链接:
首先考虑长为奇数的情况,你试着画几个就会发现那个根本不可能成立,所以只有长度为偶数的情况才可以。。
然后就会发现除了2这种特殊情况外,其余的2 4 6 8都只有两种情况
具体参看 http://blog.csdn.net/chaoojie/article/details/8860935
把 4, 6, 8.... 看成一整块,就有下图两种情况(正着,倒着)
那么递推公式就出来了
F[N]=F[2]*F[N-2]+F[4]*F[N-4]+.......F[N]*F[0]
F[N-2]=F[2]*F[N-4]+F[4]*F[N-6]+......F[N-2]*F[0]
又我们刚才得出结论除了F[2]=3,其余的都等于2
所以两个式子相减得到
F[N]=4*F[N-2]-F[N-4]
直接打表计算即可。。。
代码:
#include<cstdio> #include<cstring> const int maxn=31+10; int dp[maxn],n; int main() { dp[0]=1; dp[2]=3; for(int i=4;i<=32;i++) dp[i]=4*dp[i-2]-dp[i-4]; while(~scanf("%d",&n)&&n!=-1) { if(n%2) printf("0\n"); else printf("%d\n",dp[n]); } return 0; }
时间: 2024-10-18 10:55:26