Description
In how many ways can you tile a 3xn rectangle with 2x1 dominoes?
Here is a sample tiling of a 3x12 rectangle.
Here is a sample tiling of a 3x12 rectangle.
![](https://i-blog.csdnimg.cn/blog_migrate/044c8d8bff539d2c98a8c39e481bc447.jpeg)
Input
Input consists of several test cases followed by a line containing -1. Each test case is a line containing an integer 0 <= n <= 30.
Output
For each test case, output one integer number giving the number of possible tilings.
Sample Input
2 8 12 -1
Sample Output
3 153 2131
关键是找出递推公式。
当n为偶数时:
f(n) = 3 * f(n - 2) + 2 * f(n - 4) + 2 * f(n - 6) + .... + 2 * f(0)
f(0) = 1
当n为奇数时:
f(n) = 0
#include<stdio.h>
#include<string.h>
int a[30];
int func(int n){
int i, sum = 0;
if(n == 0) return 1;
if(a[n] != 0) return a[n];
for(i = n - 2; i >= 0; i -= 2){
if(i == n - 2) sum += 3 * func(i);
else sum += 2 * func(i);
}
a[n] = sum;
return sum;
}
int main(){
int n;
memset(a, 0, sizeof(a));
while(1){
scanf("%d", &n);
if(n == -1) return 0;
if(n % 2) printf("0\n");
else printf("%d\n", func(n));
}
return 0;
}