問題: n段の階段を、1歩でa段またはb段ずつ上る方法は何通りあるか?
例: n=11, a=3, b=4の場合
dp[i] = i段目に到達する方法の数
dp[0] = 1:0段目(スタート地点)にいる方法は1通りdp[i]:i段目には、(i-a)段目または(i-b)段目から来ることができる
// 初期化フェーズ
const dp = new Array(n + 1).fill(0); // O(n) 空間
dp[0] = 1; // ベースケース
// 計算フェーズ
for (let i = 1; i <= n; i++) { // O(n) 時間
if (i >= a) dp[i] += dp[i - a]; // 状態遷移1
if (i >= b) dp[i] += dp[i - b]; // 状態遷移2
}
O(n)
各段を1回ずつ計算
O(n)
DPテーブルのサイズ
異なるパラメーターでDPの動作を確認しよう!