标签:
题目链接:
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; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/45110651