Official

C - 階段の上り方 / Ways to Climb Stairs Editorial by sounansya


\(d[i]\) を「\(0\) 段目から \(i\) 段目まで上る方法の数」と定義します。求める値は \(d[N]\) です。

まず \(i \in B\) である場合は \(d[i]=0\) です。それ以外の場合は \(d[i]=d[i-1]+d[i-2]+d[i-3]\) となります。

この漸化式を元に順に遷移を計算することで \(d[N]\) の値を求めることができます。

実装例(Python3)

n, m = map(int, input().split())
ok = [True] * (n + 1)
if m != 0:
    b = map(int, input().split())
    for v in b:
        ok[v] = False
d = [0] * (n + 1)
MOD = 10**9 + 7
d[0] = 1
for i in range(1, n + 1):
    if not ok[i]:
        continue
    for k in range(3):
        j = i - k - 1
        if j >= 0:
            d[i] += d[j]
    d[i] %= MOD
print(d[n])

posted:
last update: