第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 でですが。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません