题目链接:
http://poj.org/problem?id=2506
题目大意:
有一个大小2*N的矩形地板,用规格为2*2和2*1的瓷砖方块去填满它,共有多少种方案
思路:
设长度为N的矩形地板共有F[N]种方案。共有三种放法:
先放一块2*2瓷砖方块,则F[N] = F[N-2]。
先放两块横着的1*2的瓷砖,则F[N] = F[N-2]。
先放一块竖着的2*1的瓷砖,则F[N] = F[N-1]。
总和一下,就是:F[N] = F[N-1] + 2*F[N-2]。
因为0 <= N <= 250,所以要用到高精度。用整型数组F[][]来计算,然后用字符型数组Fi[][]
来存储结果。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 300;
const int MAXNLEN = 400;
int F[MAXN][MAXNLEN];
char Fi[MAXN][MAXNLEN];
void Solve()
{
F[0][0] = 1;
F[1][0] = 1;
for(int i = 2; i <= 250; ++i)
{
for(int j = 0; j <= 350; ++j)
{
F[i][j] = F[i][j] + F[i-1][j] + F[i-2][j] + F[i-2][j];
if(F[i][j] >= 10)
{
F[i][j+1] += F[i][j]/10;
F[i][j] %= 10;
}
}
}
for(int i = 0; i <= 250; ++i)
{
int j;
for(j = 350; j >= 0; --j)
if(F[i][j] == 0)
continue;
else
break;
int k = 0;
for(; j >= 0; --j)
Fi[i][k++] = F[i][j] + '0';
Fi[i][k] = '\0';
}
// for(int i = 0; i <= 50; ++i)
// cout << Fi[i] << endl;
}
int main()
{
Solve();
int N;
while(cin >> N)
{
cout << Fi[N] << endl;
}
return 0;
}