1. 程式人生 > >POJ2663 Tri Tiling

POJ2663 Tri Tiling

space class += include sca () can poj int

  • 思路:

設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;
}

POJ2663 Tri Tiling