>Link
ybtoj平铺方案
>解题思路
设 f i f_i fi为前 i i i列的平铺方案
则此时有三种情况:
- 竖着放一个1*2的,由 f i − 1 f_{i-1} fi−1转移
- 放一个2*2的,由 f i − 2 f_{i-2} fi−2转移
- 横着放两个1*2的,由 f i − 2 f_{i-2} fi−2转移
将三种情况加起来即可(数据太大,要用高精度)
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 260
#define maxn 90
using namespace std;
int n, f[N][maxn + 5];
void gjj (int a, int b)
{
int g = 0;
for (int i = maxn; i; i--)
{
f[a][i] += f[b][i] + g;
g = f[a][i] / 10;
f[a][i] %= 10;
}
}
void write (int a)
{
int p = 1;
while (f[a][p] == 0) p++;
for (int i = p; i <= maxn; i++)
putchar (f[a][i] + '0');
putchar (10);
}
void work ()
{
memset (f, 0, sizeof (f));
f[0][maxn] = f[1][maxn] = 1;
for (int i = 2; i <= n; i++)
{
gjj (i, i - 1);
gjj (i, i - 2);
gjj (i, i - 2);
}
write (n);
}
int main()
{
while (~scanf ("%d", &n))
work ();
return 0;
}