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

转载于:https://www.cnblogs.com/Patt/p/9980649.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值