Tiling
Description
In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles?
Here is a sample tiling of a 2x17 rectangle. ![]() Input
Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.
Output
For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle.
Sample Input 2 8 12 100 200 Sample Output 3 171 2731 845100400152152934331135470251 1071292029505993517027974728227441735014801995855195223534251 Source |
该题为经典递推题,与之前做过的递推不太一样的就是这个数据比较大,所以我这里的处理方法为字符串处理。
整体思路为:一个2*2的格子有一下三种方式:
所以说递归式子为:
a[i] = a[i-2] + a[i-1] + a[i-2];
两个a[i-2]分别对应
归结到底,该题为 字符串处理整数相加+递推。
参考代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
string cal(string a, string b) //两个数相加函数
{
if( a.length()<b.length() ) //把结果放在字符串a中,所以要保证a是大的字符串
swap(a,b);
for( int i = a.length(),j = b.length();i >= 0;i--,j-- )//从个位数开始相加
{
a[i] = a[i] + (j>=0?b[j]-'0':0);//判断b是否到头
if( a[i]-'0'>=10 )//进位处理
{
a[i] = (a[i]-'0')%10+'0';
if( i )//判断是否为最高位
a[i-1]++;
else a = '1' + a;
}
}
return a;
}
int main()
{
string a[260];
a[0] = "1";
a[1] = "1";
for( int i = 2;i <= 250;i++ )//递归过程;
{
a[i] = cal(cal(a[i-2],a[i-1]),a[i-2]);
}
int n;
while(cin>>n)
cout<<a[n]<<endl;
return 0;
}