zoukankan      html  css  js  c++  java
  • 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$ 个数中的某一个,写成倒推的形式即
    egin{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)$ 的表达式
    egin{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}
    那么有
    egin{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)$,容易得到如下递推式
    egin{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

  • 相关阅读:
    Intel x86
    FPGA自计数六位共阳极数码管动态显示2(调用task的方法)
    FPGA六位共阳极数码管动态显示
    运算放大器是模拟电路的基石,模拟电路设计
    这样讲你就懂了!大牛给你介绍《信号与系统》
    电容计算公式
    fork...join的用法
    芯片电源管脚的去耦电容究竟要用多大的?
    Blog Contents
    linux grep 命令常见用法
  • 原文地址:https://www.cnblogs.com/Patt/p/9980649.html
Copyright © 2011-2022 走看看