const dp = Array(n + 1).fill(0); dp[0] = 1; for (let i = 1; i <= n; i++) {
if (i>= a) dp[i] += dp[i - a]; if (i >= b) dp[i] += dp[i - b]; if (i >= c)
dp[i] += dp[i - c]; }
🟢 O(1)最適化解法
メモリ: O(max(a,b,c))
配列サイズ: M 要素
M=4の場合: 4要素のみ
特徴: 円形バッファで必要最小限
const M = Math.max(a, b, c); const dp = Array(M).fill(0); dp[0] = 1; for
(let i = 1; i <= n; i++) { let ways=0; if (i - a>= 0) ways += dp[(i - a) %
M]; if (i - b >= 0) ways += dp[(i - b) % M]; if (i - c >= 0) ways += dp[(i -
c) % M]; dp[i % M] = ways; }