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 |
|
|
| 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 |