0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

paizaラーニング レベルアップ問題集 DPメニュー JavaScript 【階段の上り方】階段の上り方 3

Last updated at Posted at 2023-03-02

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

解答例

dp[i]はi段目に上る方法の通りを表します。
dp[0] = 1;は、0段目にいる、という意味です。dp[0] = 0;だと、0段目にいないことになります。0段目にいるという意味で1です。0段目に至る方法も1つだけとして、1です。2だと、0段目に至る方法が2つあるという意味で、よくわからないことになります。

for (let i = 1; i <= n; i++)で一段ずつ見ていきます。

dp[i] = 0;は、i段目に至る方法がない、そこには行けないという意味の0が初期値です。

もしi>=aならば、i-a段目からi段目にいけるので、
dp[i]+=dp[i-a](またはdp[i] = dp[i] + dp[i - a];)です。
dp[i-a]>=1なら、i-a段目とi段目がつながるイメージです。
dp[i-a]=0なら、i-a段目にはいないので、つながりません。

b,cについても同様です。

すると、dp[i]に上るのに、何通りあるか、いくつ繋がるか、求まります。

これをi=nまで繰り返すと、0段目からn段目までの行き方が全てつながり、全部で何通りあるか求まります。

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, a, b, c] = lines[0].split(" ").map(Number);

const dp = Array(n + 1).fill(0);

dp[0] = 1;
for (let i = 1; i <= n; i++) {
  dp[i] = 0;
  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];
  }
}
console.log(dp[n]);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?