Time Limit: 10 second
Memory Limit: 2 MB
问题描述
有1*n的一个长方形,用一个1*1、1*2、1*3的骨牌铺满方格。例如n=3时为1*3的方格。此时用1*1、1*2、1*3的骨牌铺满方格,共有四种铺法。
Input
输入整数n。
Output
输出方法数
Sample Input
3
Sample Output
4
【题解】
假设我们现在要铺第4格,我们可以在铺满第一格的时候加上一块1*3的骨牌,也可以在铺满前两格的时候铺上一块1*2的骨牌,也可以在铺满前3格的时候铺上一块1*1的骨牌。
而铺满一块,两块,3块的方法,很容易就能得到。
由此可以得到一个递推式,即a[i]=a[i-1] + a[i-2] +a[i-3];
【代码】
#include <cstdio>
#include <cstring>
int n,a[100000];
void input_data()
{
a[1] = 1;
a[2] = 2;
a[3] = a[1] + a[2] + 1;
a[4] = a[1] + a[2] + a[3]; //前面几种情况直接写出来
scanf("%d",&n);
}
void output_ans()
{
if (n <=4 ) //如果是小于4的情况直接输出 否则就递推 直到得到答案为止。
printf("%d",a[n]);
else
{
for (int i = 5;i<=n;i++)
for (int j = i-3;j <=i-1;j++)
a[i] += a[j];
printf("%d",a[n]);
}
}
int main()
{
input_data();
output_ans();
return 0;
}