第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 です。ゼロ段の階段を上る方法ってなんだろうと思ってはいけない。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません