题目链接:
首先考虑长为奇数的情况,你试着画几个就会发现那个根本不可能成立,所以只有长度为偶数的情况才可以。。
然后就会发现除了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;
}
本文探讨了一个关于偶数长度匹配的问题,并给出了详细的解析过程。通过观察发现仅偶数长度的情形符合要求,且存在固定的两种模式。进一步利用递推公式F[N]=4*F[N-2]-F[N-4]进行计算,最终通过代码实现了问题的解决。
&spm=1001.2101.3001.5002&articleId=41008169&d=1&t=3&u=6843d3903ebf40deb592e1368b11b7e8)
344

被折叠的 条评论
为什么被折叠?



