9273:PKU2506Tiling

总时间限制: 
2000ms
 
单个测试点时间限制: 
1000ms
 
内存限制: 
131072kB
描述

对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。

下图是一个2行17列的走道的某种铺法。



输入

整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250

输出

如题

样例输入
2
8
12
100
200
样例输出
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
int a[301][501];
int my_max(int x,int y)
{
return x>y?x:y;
}
int main()
{
memset(a,0,sizeof(a));
a[1][0]=1;
a[1][1]=1;
a[2][0]=1;
a[2][1]=3;
for(int i=3;i<=300;i++)
{
for(int j=1;j<=my_max(a[i-2][0],a[i-1][0]);j++)
{
a[i][j]=a[i-1][j]+a[i-2][j]*2;
}
a[i][0]=my_max(a[i-2][0],a[i-1][0]);
for(int j=1;j<=a[i][0];j++)
{
a[i][j+1]+=a[i][j]/10;
a[i][j]%=10;
}
while(a[i][a[i][0]+1])
{
a[i][0]++;
a[i][a[i][0]+1]+=a[i][a[i][0]]/10;
a[i][a[i][0]]%10;
}
}
int n;
while(cin>>n)
{
if(n==0)cout<<1<<endl;
else
{
for(int i=a[n][0];i>=1;i--)
cout<<a[n][i];
cout<<endl;
}
}
return 0;
}
原文地址:https://www.cnblogs.com/crazily/p/9491483.html