問題はこちら
問題概要
価格の個の饅頭, 入る饅頭の個数で価格の個の箱が与えられるので箱をいくつか買って饅頭を詰めて売るときの利益の最大値を求めよ.
思考の流れ
詰める饅頭は高いものから.
饅頭を個詰められる箱の選び方で最小の値段のものを選べばいい.
ナップサック問題っぽいのでを「番目の箱まで見た時に, 饅頭を個詰められる箱の選び方での最小の値段」とおいてDPを行えばよさそう.
更新式は
となる. jの大きい方から更新していけば「番目の箱まで見た」という条件が必要なくなるので空間計算量を削減できる.
結局,を「饅頭を個詰められる箱の選び方での最小の値段」とおいて
このままだと時間計算量はなので間に合わない
「饅頭を個詰められる」としてしまうとだが, 詰める饅頭の数は個以下なのでとなる. の更新式だけ変える必要があるので注意.
時間計算量はとなり, 十分高速.
提出プログラム
https://atcoder.jp/contests/joi2014ho/submissions/11915138
感想
解法はすぐ浮かんだが2つ目の矢印を無視して提出してしまってTLE, その後AC. DP高速化ってわけでもないが条件から計算量を削減できないか考えた方がいいと感じた.