ツバサの備忘録

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

ABC017 D - サプリメント

問題
提出コード

解法

dp[i] = i番目までのサプリメントを飲む方法数
とします。
i番目のサプリメントを飲むときは、
i番目のみを1日で飲む
i-1番目とi番目の2つを1日で飲む
i-2番目からi番目の3つを1日で飲む
というように、同時に飲むこともできます。
しかし、i-k番目からi番目のk+1個を1日で飲むには条件があり、
i-k番目からi番目まではすべて違う種類である必要があります。
ということで、
dp[i] = \sum dp[i-k]
となります。 memo[i] = i番目と同日に食べることができないi未満のサプリメントの番号の最大値
とすると、 これがkの最小値-1となり、これはO(N)で準備することができます。
あとは、上の式をもとにして答えを求めるだけなのですが、このまま愚直に書くと部分点しかとれません。
dp[i]を求める際に足す値は、区間になっているので、dp[x]についての累積和を同時に求めていけば、うまくO(1)でdpの更新を行うことができ、これで答えが求まります。