F - Select Half

Quiz

https://atcoder.jp/contests/abc162/tasks/abc162_f

f:id:peroon:20200415071736p:plain

AC code

https://atcoder.jp/contests/abc162/submissions/11935719

dp[i][j][k]
i : まで見て (N)
j : その点を選んだ/選んでいない (0,1)
k : 大ジャンプ回数 (0,1,2)
として配るDP

解法以外

  • 解法は他の方のblogを参考ください
  • 本記事では「これを考慮漏れしていませんか?」というのを書きます

N=偶数の時は1つ飛びで取っていけばいいか?

いいえ、例えばN=4で「○✕✕○」も条件を満たします

「✕✕」を大ジャンプと呼ぶとして、それの出現回数は0か1?

いいえ、N=7で「○✕✕○✕✕○」も条件を満たします

イメージ

f:id:peroon:20200415072240p:plain

dp[i][j]
i : まで見て
j : で最後に選んだ場所の添字

とすると表を埋めるだけでもO(N2)でオーバーです。ただ、今回は「ほぼ飛び飛び」という制限があるので、前回の状態と今回の状態が近い、画像のような状態であり、表全てを埋める必要がないためO(N)に収まると理解しました

サンプル4の解

{1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}
  • next_permutationで全探索を2分回して発見し、DPのテーブル更新が適切に進んでいるかの確認に利用した