junior19

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Problem C: 爬楼梯

Description

小时候,我只能一阶一阶得爬楼梯,

后来,我除了能一次爬一阶,还可以一次爬两阶,

到现在,我最多一次可以爬三阶。

那么现在问题来了,我想爬上n层楼,相邻楼层之间有一段楼梯,虽然我一次可以爬1个台阶、2个台阶和3个台阶,但是我在ii+1层之间的楼梯上时,我不能跨越到i+1i+2层之间的楼梯。现在有个n层的楼,知道每一段楼梯的阶数,我想知道,如果我只会往上走,并且忽略其他不在楼梯上的其他移动,共有多少种方案可以到达第n层。

Input

第一行一个整数T0<T<=50)表示有多少组样例。

对于每一组样例:

第一行一个n1<n<=50)表示有多少层楼。

接下来一行,包括n-1个整数xi0<xi<=20),由下到上依次表示每段楼梯的长度。

Output

对于每组数据,输出一行表示共有多少种方案。由于答案较大,所以输出答案请对10007取模。

Sample Input

22344 5 6

Sample Output

思路:开个数组预处理,由于不能跨楼层,每个楼梯结果相乘即可。

# include <bits/stdc++.h>
# define MOD 10007
using namespace std;

int a[21] = {0,1,2,4};
int main()
{
    int t, n, num;
    for(int i=4; i<=20; ++i)
        a[i] = (a[i-1] + a[i-2] + a[i-3]) % MOD;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        int ans = 1;
        for(int i=0; i<n-1; ++i)
        {
            scanf("%d",&num);
            ans = (a[num] * ans) % MOD;
        }
        printf("%d\n",ans);
    }
    return 0;
}


posted on 2017-03-27 23:24  junior19  阅读(201)  评论(0编辑  收藏  举报