Submission #68670872


Source Code Expand

#include <iostream>
#include <vector>

int main() {

    int mod = 1e9 + 7; // 10^9 + 7

    // 入力
    int stairs, broken_stairs;
    std::cin >> stairs >> broken_stairs;

    // 破損した段を格納するベクタ
    std::vector<int> is_broken(stairs + 1, 0);

    // 破損した段を入力
    for (int i = 0; i < broken_stairs; ++i) {
        int broken_step;
        std::cin >> broken_step;

        is_broken[broken_step] = 1;
    }

    /*
    動的計画法について

    動的計画法とは、問題を小さな問題に分解し、それらの答えを組み合わせて全体の答えを求める手法のことである。この問題では、それぞれの段に到達する方法の数を部分的に計算し、それらを組み合わせて最終的な答えを求めている。


    i段目に到達する方法の数をdp(i)とすると、求める式は以下のようになる。

    1. 0段目に行く方法は1通りである。(最初から立っているので)
    dp(0) = 1

    2. 1段目に行く方法は、1段前から上がる方法しかない。よって同様に1通りである。
    dp(1) = 1

    3. 2段目以降は、1段前から上がる方法と、2段前から上がる方法が使える。よって、1段前にたどり着く方法の数と、2段前にたどり着く方法の数の和に等しい。
    dp(i) = dp(i - 1) + dp(i - 2) (i ≧ 2)

    これらの式を用いて、N段目に到達する方法の数を計算していくことができる。

    なお、破損した段は到達できないため、その段に対しては処理をスキップする必要がある。
    */

    // i段目に到達する方法の数を格納するベクタ
    std::vector<int> dp(stairs + 1, 0);

    // 1. 0段目に行く方法は1通り
    dp[0] = 1;

    // 2. 1段目に行く方法も1通り
    if(is_broken[1] == 0) { // 破損していない場合
        dp[1] = 1;
    }

    for (int i = 2; i <= stairs; ++i) {
        if(is_broken[i] == 0) {  // 破損していない場合
            // 3. 2段目以降は、1段前から上がる方法と、2段前から上がる方法が使える。
            // 注意: 値が非常に大きくなる可能性があるので、この時点でmodで割った余りを使うこと。
            dp[i] = (dp[i - 1] + dp[i - 2]) % mod;
        }
    }

    // 最上段に到達する方法の数を出力
    std::cout << dp[stairs] << std::endl;

    return 0;
}

Submission Info

Submission Time
Task C - Typical Stairs
User AutumnOctJXS
Language C++ 20 (gcc 12.2)
Score 300
Code Size 2558 Byte
Status AC
Exec Time 16 ms
Memory 3984 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 300 / 300
Status
AC × 3
AC × 36
Set Name Test Cases
Sample s1.txt, s2.txt, s3.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, s1.txt, s2.txt, s3.txt
Case Name Status Exec Time Memory
01.txt AC 1 ms 3468 KiB
02.txt AC 1 ms 3520 KiB
03.txt AC 1 ms 3368 KiB
04.txt AC 1 ms 3524 KiB
05.txt AC 1 ms 3492 KiB
06.txt AC 1 ms 3472 KiB
07.txt AC 1 ms 3472 KiB
08.txt AC 1 ms 3372 KiB
09.txt AC 1 ms 3492 KiB
10.txt AC 1 ms 3492 KiB
11.txt AC 1 ms 3328 KiB
12.txt AC 1 ms 3440 KiB
13.txt AC 1 ms 3496 KiB
14.txt AC 1 ms 3564 KiB
15.txt AC 1 ms 3460 KiB
16.txt AC 13 ms 3784 KiB
17.txt AC 2 ms 3556 KiB
18.txt AC 5 ms 3616 KiB
19.txt AC 4 ms 3596 KiB
20.txt AC 1 ms 3492 KiB
21.txt AC 3 ms 3544 KiB
22.txt AC 1 ms 3652 KiB
23.txt AC 5 ms 3592 KiB
24.txt AC 2 ms 3808 KiB
25.txt AC 2 ms 3492 KiB
26.txt AC 2 ms 3880 KiB
27.txt AC 2 ms 3860 KiB
28.txt AC 16 ms 3984 KiB
29.txt AC 9 ms 3864 KiB
30.txt AC 2 ms 3872 KiB
31.txt AC 6 ms 3880 KiB
32.txt AC 7 ms 3904 KiB
33.txt AC 8 ms 3868 KiB
s1.txt AC 1 ms 3496 KiB
s2.txt AC 1 ms 3572 KiB
s3.txt AC 1 ms 3500 KiB