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

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

はじめに

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

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

煩悩の数が 108 って多いのでしょうか、少ないのでしょうか。そもそも、108 個自分の煩悩を言える人はいるのでしょうか。と、煩悩まみれの LeoSaki(旦那)が申しております。

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

【階段の上り方】階段の上り方 3

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

(ヒント)

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

n a b c

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

・ 1 ≦ n ≦ 30
・ 1 ≦ a ≦ 7
・ 1 ≦ b ≦ 7
・ 1 ≦ c ≦ 7
・ a ≠ b
・ b ≠ c
・ c ≠ a


入力例

10 2 3 4

出力例

17

ちゃんと理解していれば、すらすらと書くことができるはず。しかし、1 歩で 7 段登れる人ってどんな人なんだろう。

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])
VBA
NABC = Split(Cells(1, 1), " ")
N = Val(NABC(0))
A = Val(NABC(1))
b = Val(NABC(2))
C = Val(NABC(3))
Dim dp() As Long
ReDim dp(N)
dp(0) = 1
For i = 1 To N
    If i >= A Then
        dp(i) = dp(i) + dp(i - A)
    End If
    If i >= b Then
        dp(i) = dp(i) + dp(i - b)
    End If
    If i >= C Then
        dp(i) = dp(i) + dp(i - C)
    End If
Next
Debug.Print dp(N)

最後に

LeoSaki(旦那)であれば 1 歩で 7 段くらいいけるいける、この長い足で、と言ったら、LunaSaki(嫁)に物凄く冷たい目で見られて辛いです。

初期値がどういう理由で 0 であるか、1 であるか、きちんと理解したうえで設定しておかないと、微妙に数字がズレてしまいます。この問題だと、ゼロ段の階段を上る方法は 1 通りなので、dp[0] = 1 です。ゼロ段の階段を上る方法ってなんだろうと思ってはいけない。

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

Pythonpaiza,学習,Python

Posted by LeoSaki