【9304】骨牌铺法

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;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7632425.html