問題はこちら
問題概要
人の幼児が左右一列に並んでおり, 左から番目の幼児の活発度はである. 幼児の順番を好きに並び替える. はじめ左から番目に並んでいた幼児が左から番目に移動するとき,うれしさがだけ生じる. 幼児のうれしさの合計の最大値を求めよ.
思考の流れ
まず, 活発度の高い幼児から順に一番遠いところに入れるgreedyを思い付くが, 入力例2などで不正解となる.
なぜダメかというとを右に入れたせいでつのが一つ左にずれてうれしさが減少したから.
この場合, を左端に入れるべきだった.
大きい順に入れていくのはいいとして, 左右どちらに入れるのがよいか. 全探索しようとすると通り試す必要がある.
左右から数字が埋まっていく. ある数字を左右どちらに入れるか考えるときに, 今まで入れた数字がそれぞれどこにあるかは関係なく, 左右の数字がどこまで埋まっているかがわかればよさそう.
DPをする. を「左から番目, 右から番目までが埋まっているときの最大値」とすると更新式は, を「活発度が大きい方から番目の幼児の活発度」, を「活発度が大きい方から番目の幼児の元の位置」として
ただし, の小さい方からDPを行う.
証明
なぜ大きい方から端に埋めていくのがいいのか?
図1のような状況を考えた時, 図2のようにすることでうれしさの合計を増加させることができる.
これは, 「元の位置より右にずらすものは, 元の位置より左にずらすものよりも, ずらした後の位置が必ず右にある」ことを意味している.
また, のとき図3のような状況を考えると, 図4のようにすることで, うれしさの合計を増加させることができる.
同様に, のとき図4のような状況を考えると, 図3のようにすることで, うれしさの合計を増加させることができる.
以上のことから端から大きい順に埋めていくのが最適となる.
提出プログラム
https://atcoder.jp/contests/abc163/submissions/12180393
感想
制約がDPっぽかったがわからなかった. 解説書いてみると, 普通の流れで解けたと思って反省.