题目大意:
有2×1和2×2两种规格的地板,现要拼2×n的形状,共有多少种情况基本思路:递推;
假设我们已经铺好了2×(n-1)的情形,则要铺到2×n则只能用2×1的地板
假设我们已经铺好了2×(n-2)的情形,则要铺到2×n则可以选择1个2×2或两个2×1,故可能有下列三种铺法
其中要注意到第三个会与铺好2×(n-1)的情况重复,故不可取,故可以得到递推式
a[i]=2*a[i-2]+a[i-1];
然后就是高精度部分,可直接用高精度的模板,在这里我用的是string类型
代码如下
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
string a[300];
string add(string a,string b)
{
if(a.length()<b.length())
swap(a,b);
int i,j,up=0,temp;
for(i=a.length()-1,j=b.length()-1;i>=0;i--,j--)
{
a[i]=a[i]+(j>=0?b[j]-'0':0)+up;
temp=(a[i]-'0')%10;
up=(a[i]-'0'-temp)/10;
a[i]=temp+'0';
if(i==0&&up!=0) a="1"+a;//防止最高位进一无法储存;
}
return a;
}
int main()
{
int n;
a[0]="1",a[1]="1";
for(int i=2;i<=250;++i)
a[i]=add(add(a[i-2],a[i-1]),a[i-2]);//递推;
while(cin>>n)
cout<<a[n]<<endl;
return 0;
}