公式

A - Operations on a Stack 解説 by leaf1415


昇順の整数列 \(1 \leq p_1 \lt p_2 \lt \cdots \lt p_l \leq N\) に対し、 最後にスタックに残るのが \(A\)\(p_1, p_2, \ldots, p_l\) 番目の要素であるような操作手順が存在する必要十分条件は、

すべての \(i = 1, 2, \ldots, l+1\) について \(p_i - p_{i-1}\) が奇数である

ことです。ただし、\(p_0 \coloneqq 0, p_{l+1} \coloneqq N+1\) とします。

  • (必要性) \(p_{i-1}\) 番目の要素の後、\(p_i\) 番目の要素がスタックに残るためには、\(p_{i-1}+1, p_{i-1}+2, \ldots, p_i-1\) 番目の要素がスタックに残らないような方法で \(p_{i-1}+1, p_{i-1}+2, \ldots, p_i-1\) 回目の操作を行う必要があるため、\(p_{i-1}+1, p_{i-1}+2, \ldots, p_i-1\) 回目の操作の中には push と pop が同数含まれる必要があります。よって、\(p_i - p_{i-1}\) が奇数であることが必要です。
  • (十分性) 各 \(i\) について、 \(p_{i-1}+1, p_{i-1}+2, \ldots, p_i-1\) 回目の操作では push と pop を交互に同数ずつ行なった後、\(p_i\) 回目の操作で push を行うことで、スタックに所望の要素を残すことができます。

よって本問題は、\(A\) の各要素についてスタックに残すかどうかを選び(便宜上、\(0\) 番目と \(N+1\) 番目も残すとみなす)、残すことにした要素で隣り合うものどうしの添字の差が奇数であるようにするときの、残す要素の総和を最大化する問題です。

これは、\(i = 1, 2, \ldots, N\) の順で \(i\) 番目の要素をスタックに残すかどうかを決定していくとし、

\(\mathrm{dp}[i][j] =\)\(i\) 番目の要素まで残すかどうかを決定し、残すことにした直前の要素が偶数個( \(j = 0\) ) or 奇数個( \(j=1\) )前のときの、それまでに残した要素の総和としてあり得る最大値)

という DP テーブルを用いた動的計画法によって \(O(N)\) 時間で解くことができます。

投稿日時:
最終更新: