题目大意:给出n,计算用1*2的瓷砖有多少种方法铺满3*n的地方。
解题思路:和uva 10359 - Tiling有点相似,不过难度会比较大,公式c[i] = 4 * c[i - 2] - c[i - 4].
推导过程:c[0] = 1, c[2] = 3, c[4] = c[2] * 3 + c[1] * 2, c[6] = c[4] * 3 + (c[0] + c[2]) * 2 ....
即c[i] = c[i - 2] * 3 + 2 *∑(0≤j≤-4) c[j], 然后带入前一项的公式可以化简成上面的公式。
#include <stdio.h> #include <string.h> #define ll long long ll n, c[35]; void init() { memset(c, 0, sizeof(c)); c[0] = 1; c[2] = 3; for (int i = 4; i <= 30; i++) c[i] = 4 * c[i - 2] - c[i - 4]; } int main() { init(); while (scanf("%lld", &n), n!= -1) { printf("%lld ", c[n]); } return 0; }