広東工業大学第12回ACMプログラム設計大会Problem C:階段を登る

1154 ワード

Problem C:階段を登る
Description
子供の頃は階段を1階1階しか登れませんでしたが、
その後、私は1回に1階に登ることができるほか、1回に2階に登ることができます.
今まで、私はせいぜい1回で3階に登ることができます.
では、今問題が来ました.n階に登りたいです.隣の階の間に階段があります.一度に1つの階段、2つの階段、3つの階段を登ることができますが、iとi+1階の間の階段を上るときは、i+1とi+2階の間の階段を越えることはできません.今n階のビルがあって、各階段の階数を知っていて、もし私が上へ行くだけで、他の階段ではない他の移動を無視して、どのような案がn階に着くことができるか知りたいです.
Input
1行目の整数T(0)は、サンプルのセット数を表す.
各サンプルのセットについて:
1行目のn(1)は何階建てかを表します.
次の行は、n−1個の整数xi(0)を含み、各階段の長さを下から上へ順に表す.
Output
各グループのデータについて、1行が出力されると、どのようなシナリオが共有されるかが示されます.答えが大きいので、出力は10007に型を取ってください.
Sample Input
22344 5 6
Sample Output
4
フロアが分割されているので..各階の可能数をdpで乗算するだけで答えです
#include
#include
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    int dp[10003];
    dp[1]=1;
    dp[2]=2;
    dp[3]=4;
    for(int i=4; i<=20; i++)
    {
        dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
        dp[i]%=10007;
    }
    while(t--)
    {
        int a[10003];
        int n;
        scanf("%d",&n);
        long long ans=1;
        for(int i=1; i