hihoCoder offer 收割编程练习赛 83 C 播放列表

题目

\(1,2 ,3 \dots, N\) 代表 \(N\) 首歌。设想有 \(L\) 个格子排成一排,编号 \(1\)\(L\) 。考虑将这些数字挨个填进格子里的情形。假设当前要往第 \(i\) 个格子里填一个数字(此时前面 \(i-1\)个坑里都已经填上数字了)若只考虑相邻两个数字不能相同这个条件,则第 \(i\) 个格子有 \(N-1\) 种填法。不难想到我们还需要知道前 \(i-1\) 个格子里填了多少种数字(即多少个不同数字)。

以下描述中,“相邻两个数字不同”这一条件总是满足,不再重复。

\(f(i,j)\) 表示“前 \(i\) 个格子填好之后共有 \(j\) 个不同数字”(不必知道这 \(j\) 个数字具体是哪些)的方案数。则 \(f(i,j)\) 可以转移到 \(f(i+1,j)\)\(f(i+1,j+1)\),分别对应着第 \(i\) 个格子内填余下的 \(n-j\) 个数中的某一个和填前 \(i\) 个格子中除了第 \(i\) 个格子里的数之外的 \(j-1\) 个数中的某一个,写成倒推的形式即
\begin{equation*}
f(i, j) = (j-1) f(i-1,j) + (n - j + 1) f(i-1,j-1),
\end{equation*}
边界条件是 \(f(1,1) = n\)

我们还可以从另一个角度考虑这个问题。

考虑某个合法的播放列表 \(a_1, a_2, \dots, a_N\),用 \(p_i\) 表示第 \(i\)新数(即前面没出现过的数)所在的位置(即格子编号)显然有 \(p_1 = 1\)\(p_2 = 2\),并且 \(a_{p_1}, a_{p_2}, \dots, a_{p_N}\) 构成 \(1\)\(N\) 的一个排列。

考虑映射 \(a_1, a_2, \dots, a_N \mapsto a_{p_1}, a_{p_2}, \dots, a_{p_N}\)

不难看出,根据上述映射可将所有合法的播放列表分成 \(N!\) 类,且每一类中的排列个数相等,将此数目记为 \(g(N-1,L-N)\) 。对于 \(i = 2, 4, \dots, N\),令 \(d_i = p_{i+1} - p_{i}-1\)\(d_{N+1} = L + 1\))通过枚举 \(d_2, \dots, d_N\),我们可以给出 \(g(N-1,L-N)\) 的表达式
\begin{equation}
\sum_{\substack{d_2, \dots, d_N \\ \sum_{i=2}^{N}d_i = L - N}} \prod_{i=2}^{N} (i-1)^{d_i}
\end{equation}
那么有
\begin{equation}
g(m, n) = \sum_{\substack{d_1, \dots, d_m \\ \sum_i d_i = n}} \prod_{i=1}^{m} i^{d_i} \label{E:SUM}
\end{equation}

关于 \(g(m,n)\),容易得到如下递推式
\begin{equation}
g(m,n) = g(m-1, n) + n g(m, n-1)
\end{equation}
边界条件:\(g(1, n) = 1,\\,f(m, 0) = 1\)
此式的组合意义可以如此理解:第一项 \(g(m-1,n)\) 对应于 \(d_m = 0\) 的情形,第二项 \(n g(m, n-1)\) 对应于 \(d_m > 0\) 的情形。

我想知道 \eqref{E:SUM} 式能否进一步化简。

枚举 $d_1, \dots, d_m $ such that \(\sum_i d_i = n\),对应着 ordered partition

posted @ 2018-11-18 23:46  Pat  阅读(158)  评论(0编辑  收藏  举报