Tiling
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9143 | Accepted: 4356 |
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.
![](https://i-blog.csdnimg.cn/blog_migrate/09098a4c7bc0e6dc5cb68974dc819f84.jpeg)
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
Analysis
本题大意是给定一个n*2的矩形,问把这个矩形分割成2*1或2*2的小矩形,一共有多少种方法。
题目比较简单,很容易可以求出递推式ans[i]=ans[i-1]+2*ans[i-2](i>1),ans[1]=1,需要注意的是ans[0]=1,开始我以为是0,因为这个交了一发WA。。。
答案的数据很大,要用数组模拟大数相加,因为n最大为250,所以可以在程序开始时预处理一下,节约时间。
Source Code
#include <cstdio>
#include <cstring>
using namespace std;
char ans[251][76],s[76];
int main()
{
int i,l,r,j,k,t,sum,p;
strcpy(ans[0],"1\0");
strcpy(ans[1],"1\0");
strcpy(ans[2],"3\0");
for (i=3; i<=250; i++)
{
l=(int)strlen(ans[i-1]);
r=(int)strlen(ans[i-2]);
j=l-1,k=r-1,sum=t=0;
while(j>=0||k>=0||sum)
{
p=sum;
if (j>=0)
p+=ans[i-1][j]-'0';
if (k>=0)
p+=(ans[i-2][k]-'0')*2;
s[t++]=p%10+'0';
sum=p/10;
j--,k--;
}
for (j=0; j<t; j++)
ans[i][j]=s[t-1-j];
ans[i][t]=0;
}
while(~scanf("%d",&i))
printf("%s\n",ans[i]);
return 0;
}