import java.util.Scanner import scala.collection.mutable object Problem258 { case class State(current: Int, delicious: Int, route: List[Int]) def proc(n: Int, sushi: IndexedSeq[Int]): (Int, List[Int]) = { val DP = mutable.IndexedSeq.fill(n + 2)(State(-1, -1, Nil)) val queue = mutable.Queue[State]() // 開始地点登録 queue.enqueue(State(0, 0, List())) while (queue.nonEmpty) { val s = queue.dequeue() // 最大の美味しさを得られているなら続行 if (DP(s.current).delicious < s.delicious) { DP(s.current) = s // まだ寿司があるなら次へ if (s.current < n) { val getSushi = State(s.current + 2, s.delicious + sushi(s.current), s.current :: s.route) val noGetSushi = State(s.current + 1, s.delicious, s.route) queue.enqueue(getSushi, noGetSushi) } } } // 一番美味しい取り方を返す(1-indexで) val result = DP.maxBy(_.delicious) (result.delicious, result.route.reverse.map(_ + 1)) } def main(args: Array[String]): Unit = { val sc = new Scanner(System.in) val N = sc.nextInt val sushi = IndexedSeq.fill(N)(sc.nextInt) val result = proc(N, sushi) println(result._1) println(result._2.mkString(" ")) } }