第108回【JavaScript】【階段の上り方】階段の上り方 3

現在取り組んでいるのは、paiza ラーニング問題集「DPメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 108 回目です。

相変わらずお客様とのやり取りが得意ではありません。しかし、立場的にお客様とのやり取りが多く発生します。「出来る人」を観察して、「出来る人」になりきる、ようにしていますが、なかなかうまくはいかないものです。

それでは、今日も頑張ってみようと思います。

【階段の上り方】階段の上り方 3 (paizaランク B 相当)

整数 n, a, b, c が与えられます。
階段を上るのに、1歩で a 段または b 段または c 段を上ることができるとき、n 段の階段を上る方法は何通りあるでしょうか。


(ヒント)

上り方が2つから3つへ増えましたが、やることは同じです。


入力される値

n a b c

入力値最終行の末尾に改行が1つ入ります。


期待する出力

n 段の階段を上る方法の数を1行に出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ n ≦ 30

・ 1 ≦ a ≦ 7

・ 1 ≦ b ≦ 7

・ 1 ≦ c ≦ 7

・ a ≠ b

・ b ≠ c

・ c ≠ a


入力例

10 2 3 4

出力例

17

こうやっていろいろなパターンに挑戦していると、身につく気がします。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const [n,a,b,c] = lines[0].split(/\s/).map(Number);
  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];
  }
  console.log(dp[n]);
});
Python
n,a,b,c = map(int,input().split())
dp = [0] * (n+1)
dp[0] = 1
for i in range(1,n+1):
    if i >= a:
        dp[i] = dp[i] + dp[i-a]
    if i >= b:
        dp[i] = dp[i] + dp[i-b]
    if i >= c:
        dp[i] = dp[i] + dp[i-c]
print(dp[n])

最後に

0 段目への行き方は、一段も上らない、という方法の一通り。だから、dp[0] = 1 が必要。ちゃんとわかっているのに書き忘れて、何度やっても不正解。間抜けなお話です。

このパターンを覚えれば、いろいろと応用が利いて良いと思います。なんだかんだで使っています。Python でですが。

引き続き、よろしくお願いいたします!

Python の第108回はこちら