ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC129 C - Typical Stairs

問題
提出コード

解法

i段目の階段にたどり着くには、i-1段目もしくはi-2段目から移動する2つの方法のどちらかを利用する必要があります。
つまり、i-1段目に行く移動の種類数と、i-2段目に行く移動の種類数がわかれば、i段目に行く移動の種類数はその総和で表すことができます。
ということで、

  • dp[i] = i段目の階段へ行くような移動方法の種類数

とすると、

  • dp[i] = dp[i-1] + dp[i-2]

となります。
ただし、ia_{j}のいずれかであったときは、dp[i] = 0となります。
また、初期状態では、0段目に必ず居るので、dp[0] = 1となります。
基本的にはこれでいいのですが、上のような集めるDPだと、i=1の際のみREをしないように別処理をしなければならないため、自分は配るDPにしました。
dp[i]が影響を与えるのは、dp[i+1],dp[i+2]なので、i+1,i+2a_{j}に含まれなかった場合に、その場所に対してdp[i]を足してあげます。
こちらの場合は、DP配列を多めに確保してあげることによって、特別な処理をする必要がなくなります。
ということでこのDPをしてあげることで、答えがdp[n]に格納されます。

感想

C問題でDPが普通に出る時代…
C問題で要求されるレベルが上がってきている気がします。
自分も実力があがっているので、さすがにこのレベルは典型として処理できるようになっています、良かったです。