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: