F - Make Pair Editorial by logx


公式解説と同様,区間 DP を行います. \(dp[i][j]\) で区間 \([i,j)\) におけるペアの選び方を表すことにします.
区間 \([i,j)\) におけるペアの選び方のうち,生徒 \(l\) と生徒 \(r\) の組を最後に選ぶ場合を考えます. この時の場合の数は

\[dp[i][l] \cdot dp[l+1][r] \cdot dp[r+1][j] \cdot \binom{\frac{j-i-2}2}{\frac{l-i}2} \cdot \binom {\frac{j-l-2}2}{\frac{j-r-1}2}\]

です.(これは,生徒 \(l\) より左のグループ,生徒 \(l\)\(r\) の間のグループ,生徒 \(r\) より右のグループに分けたと考えれば良いです.)

さて,これにより次の漸化式が立てられます:

\[\displaystyle dp[i][j]=\sum_{(l,r)\in S}dp[i][l] \cdot dp[l+1][r] \cdot dp[r+1][j] \cdot \binom{\frac{j-i-2}2}{\frac{l-i}2} \binom {\frac{j-l-2}2}{\frac{j-r-1}2}\]

ただし, \(S=\{(l,r) \mid i\leq l \lt r \lt j, l\)\(r\) は仲が良い \(\}\) とします.
この漸化式を愚直に計算すると最悪の場合で \(O(N^4)\) 程度かかるので,高速化することを考えて整理します:

\[\displaystyle dp[i][j]=\sum_{l=i}^{j-1}dp[i][l]\cdot\binom{\frac{j-i-2}2}{\frac{l-i}2} \cdot\sum_{r} \left(dp[l+1][r] \cdot dp[r+1][j] \cdot \binom {\frac{j-l-2}2}{\frac{j-r-1}2}\right)\]

(ただし, \(r\) についての和は \((l,r)\in S\) であるようなものについてのみとります.)

ここで, \(r\) についての和の部分を \(dp2[l][j]\) と定義します.つまり,

\[\displaystyle dp2[l][j]=\sum_{r} dp[l+1][r] \cdot dp[r+1][j] \cdot \binom {\frac{j-l-2}2}{\frac{j-r-1}2}\]

です.(\(r\) の動く範囲は上と同様です.)
あとは, \(dp[i][j], dp2[i][j]\)\(j-i\) が小さい方から計算するか,メモ化再帰により計算すれば良いです.

C++でのメモ化再帰による実装例: https://atcoder.jp/contests/abc217/submissions/25629426

posted:
last update: