C++で階段の登り方の総数を求めるアルゴリズムを解説
問題の概要
n段の階段があり、ある人が1段目からn段目まで登ることを考えます。このとき「一度に登れる最大段数」も与えられます。これらの情報をもとに、n段目まで登る方法が何通りあるかを求めるのが本問題の目的です。
例えば、一度に最大2段まで登れるとしましょう。この場合、漸化式を立てることで問題を解くことができます。n段目に到達するには、(n-1)段目から1段登るか、(n-2)段目から2段登るかのどちらかしかありません。したがって、次の漸化式が成り立ちます。
ways(n) = ways(n-1) + ways(n-2)
例として、階段が10段、一度に登れる最大段数が2段である場合、登り方の総数は89通りとなります。
アルゴリズムの手順
この問題は動的計画法(ボトムアップ方式)を使えば効率的に解けます。手順は以下のとおりです。
- 階段の段数と同じサイズの配列 count を定義する
- count[0] := 1 とする(0段または1段の場合、登り方は1通り)
- i を 2 から stair-1 まで繰り返す
- count[i] := 0 で初期化
- j を 1 から i まで、かつ j ≤ max の範囲で繰り返す
- count[i] := count[i] + count[i-j]
- count[stair-1] を返す
このアルゴリズムは、フィボナッチ数列と同じ構造を持っており、各段への登り方の数を小さい段から順に累積していくことで、重複計算を避けながら答えを求められます。計算量は O(n × max) です。
C++での実装例
#include<iostream>
using namespace std;
int stairClimbWays(int stair, int max){
int count[stair]; // 結果をボトムアップ方式で計算
count[0] = 1; // 0段または1段の場合、登り方は1通り
count[1] = 1;
for (int i=2; i<stair; i++){ // 2段目以降を順に計算
count[i] = 0;
for(int j=1; j<=max && j<=i; j++)
count[i] += count[i-j];
}
return count[stair-1];
}
int countWays(int stair, int max){ // 一度に1段、2段、…max段まで登れる
return stairClimbWays(stair+1, max);
}
int main (){
int stair, max;
cout << "Enter number of stairs: "; cin >> stair;
cout << "Enter max stair a person can climb: "; cin >> max;
cout << "Number of ways to reach: " << countWays(stair, max);
}入力例
Stairs = 10 Max stairs a person can climb: 2
出力例
Enter number of stairs: 10 Enter max stair a person can climb: 2 Number of ways to reach: 89
まとめ
階段の登り方の総数を求める問題は、漸化式と動的計画法を組み合わせることで、シンプルかつ効率的に解くことができます。max の値を変えれば、一度に3段以上登れるケースにも柔軟に対応できるのがこの実装の利点です。再帰を使う方法と比べて計算量を大幅に抑えられるため、実務においても有用なアプローチといえます。
-
Windowsで使えるC++開発向けおすすめIDE 7選
```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe
-
Pythonで解く「最小コストの階段登り」問題:動的計画法による実装方法
各段に負でないコスト値 cost[i] が割り当てられた階段があるとします。コストを支払うことで、1段または2段を一度に登ることができます。ここでの目的は、階段の最上部に到達するための最小コストを求めることです。なお、スタート地点はインデックス0の段、またはインデックス1の段のどちらかを自由に選ぶことができます。 例として、入力が cost = [12,17,20] の場合を考えてみましょう。このときの出力は 17 となります。理由は、インデックス1の段からスタートしてコスト17を支払い、そこから直接頂上へ向かうのが最も安く済むためです。 解き方のアプローチ この問題は動的計画法(DP)を使う