思路:
设a[i]为N=i时的方法数.i为奇数的时候肯定为0.
如果i为偶数,a[i]可以看成a[i-2]加上两个单位组成的,此时多出来的2单位有3种方法.
也可以看成a[i-4]加上四个单位组成的,此时这四个单位一定是连在一起的,中间不能分割,所以只有两种放法.
同理,可看成a[i-6]加上六个单位组成的,此时这六个单位也连在一起,不能分割,只有两种放法.
直到所有的砖块都是连在一起的,中间不能分割,也只有两种放法.
所以
a[i]=3a[i-2]+2(a[i-4]+a[i-6]+…+a[0]) ①
a[i-2]=3a[i-4]+2(a[i-6]+…a[0]) ②
①-②,得a[i]=4*a[i-2]-a[i-4].
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[40],n;
int main(){
f[0]=1;f[2]=3;
for(int i=4;i<=30;i+=2) f[i]=(f[i-2]<<2)-f[i-4];
while(1){
scanf("%d",&n);
if(n==-1) break;
printf("%d\n",f[n]);
}
return 0;
}
本文详细解析了一个关于砖墙砌筑的递归算法问题,通过数学推导得出状态转移方程,利用动态规划思想解决砖墙砌筑方案数量的计算问题。文章通过具体的代码实现,展示了如何高效地求解不同长度砖墙的砌筑方案。

2036

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



