Quiz
https://atcoder.jp/contests/abc162/tasks/abc162_f
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で「○✕✕○✕✕○」も条件を満たします
イメージ
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のテーブル更新が適切に進んでいるかの確認に利用した