题目大意是有2X1和2X2两种规格的地板 要拼成2Xn的形状,有多少种情况
下面是原题:
Tiling
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9575 | Accepted: 4554 |
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.
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
很明显递推可以很好的解决我们的问题
如果前n-1大小的砖已经铺好,那铺到2Xn的情况只能用一块2X1的竖起来摆
如果前n-2大小的砖已经铺好,那铺到2Xn的情况就可以有三种情况 用一块2X2的 或者两块2X1的(两块2X1的并排横着或并排竖着)
如果是两块2X1的并排竖着 会跟第一种情况重复,所以可以不计
由此可得到递推式 a[i] = 2*a[i-2] + a[i-1];
然后就解决就很简单了,但由于题目数据n<=250的原因 需要用到大数 我直接使用了网上大神的高精度模板 (没有全用只取了这道题需要的部分)
AC源代码:
#include<iostream>
#include<stdio.h>
using namespace std;
const int Base=1000000000;
const int Capacity=100;
typedef long long huge;
struct BigInt{
int Len;
int Data[Capacity];
BigInt() : Len(0) {}
BigInt (const BigInt &V) : Len(V.Len) { memcpy (Data, V.Data, Len*sizeof*Data);}
BigInt(int V) : Len(0) {for(;V>0;V/=Base) Data[Len++]=V%Base;}
BigInt &operator=(const BigInt &V) {Len=V.Len; memcpy(Data, V.Data, Len*sizeof*Data); return *this;}
int &operator[] (int Index) {return Data[Index];}
int operator[] (int Index) const {return Data[Index];}
};
BigInt operator+(const BigInt &A,const BigInt &B){
int i,Carry(0);
BigInt R;
for(i=0;i<A.Len||i<B.Len||Carry>0;i++){
if(i<A.Len) Carry+=A[i];
if(i<B.Len) Carry+=B[i];
R[i]=Carry%Base;
Carry/=Base;
}
R.Len=i;
return R;
}
ostream &operator<<(ostream &Out,const BigInt &V){
int i;
Out<<(V.Len==0 ? 0:V[V.Len-1]);
for(i=V.Len-2;i>=0;i--) for(int j=Base/10;j>0;j/=10) Out<<V[i]/j%10;
return Out;
}
BigInt ans[300];
int main()
{
ans[0]=1;
ans[1]=1;
int i;
for ( i = 2 ; i <= 250 ; i ++ )
{
ans[i]=ans[i-2]+ans[i-1]+ans[i-2];
}
int n ;
while ( cin >> n )
cout<<ans[n]<<endl;
return 0;
}