2019年11月27日水曜日

JOI2008 春合宿 - ナイルドットコム

f(x):=xf(x) := x日目を終えた時点での最小金額 とするとき、

f(x)=min{f(x1)+1日間同じ店で購入する場合の最小金額f(x2)+2日間同じ店で購入する場合の最小金額...f(0)+x日間同じ店で購入する場合の最小金額 f(x) = \min \begin{cases} f(x-1) + 1日間同じ店で購入する場合の最小金額 \\ f(x-2) + 2日間同じ店で購入する場合の最小金額 \\ ... \\ f(0) + x日間同じ店で購入する場合の最小金額 \end{cases}

となっている。上から順に、つまりk=1,2,...,xk=1, 2, ..., xという順にkk日間同じ店で購入する場合の最小金額を求めていくのは、ひとつ前の情報を利用すればO(N){O}(N)で可能なので、全体の計算量はO(ND2){O}(ND^2)になる。

この方針だと割り算を排除しないと通らなかった。実際のループ回数は2×1082 \times 10^8くらい?


もっとましな方法があるらしいのであとで確認する。というか、2008年当時なら通ってなさそう。