uva 10359 - Tiling(规律)

题目链接:uva 10359 - Tiling


题目大意:有两种瓷砖1*2和2*2的若干个(无限),给出n,问有多少种方法将2*n的面积铺满。


解题思路:cnt[i] = cnt[i - 1] + 2 * cnt[i - 2], 大数。


#include <stdio.h>
#include <string.h>
#define ll long long
#define max(a, b) (a)>(b)?(a):(b)
const int N = 255;

int cnt[N][N];

void add(int ans[], int a[], int b[]) {
	int sum = 0;
	ans[0] = max(a[0], b[0]);
	for (int i = 1; i <= ans[0]; i++) {
		if (i <= a[0]) sum += a[i];
		if (i <= b[0]) sum += b[i] * 2;
		ans[i] = sum % 10;
		sum /= 10;
	}

	while (sum) {
		ans[++ans[0]] = sum % 10;
		sum /= 10;
	}
}


void init() {
	memset(cnt, 0, sizeof(cnt));
	cnt[0][0] = cnt[1][0] = cnt[0][1] = cnt[1][1] = 1;
	for (int i = 2; i < N; i++)
		add(cnt[i], cnt[i - 1], cnt[i - 2]);
}

int main () {
	int n;
	init();
	while (scanf("%d", &n) == 1) {
		for (int i = cnt[n][0]; i; i--)
			printf("%d", cnt[n][i]);
		printf("\n");
	}
	return 0;
}



你可能感兴趣的:(uva 10359 - Tiling(规律))