x段目の地面からの高さをHxとし、x段目までの上り方の総数をf(x)とする。Hl≥Hx−Pとなるような最小の段をl段目とするとき、fの漸化式は
f(x)=t∈[l,x)∑f(t)
と書ける。このままDPすると間に合わないので累積和S(x):=∑t=0xf(t)を考える。
f(x)=S(x−1)−S(l−1)
S(x)=f(x)+S(x−1)
が成り立つから、Sの漸化式は
S(x)=2S(x−1)−S(l−1)
とまとまる。Sに関してDPすればよい。答えはf(N)=S(N)−S(N−1)である。
毎回lを二分探索で求めると計算量はO(NlogN)。尺取り法でO(N)。