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
hihoCoder offer 收割编程练习赛 83 C 播放列表的更多相关文章
- hihoCoder [Offer收割]编程练习赛83 D 生成树问题
题目 从 Kruskal 算法的角度来思考这个问题. 考虑 $n$ 个点的"空图"(即没有边的图). 先将 $m_2$ 条无权值的边加到图中,得到一个森林. 按边权从小到大的顺序枚 ...
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- hihocoder offer收割编程练习赛8 C 数组分拆
思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...
- hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)
题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x ...
- hihoCoder [Offer收割]编程练习赛3 D子矩阵求和
子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...
- hihocoder [Offer收割]编程练习赛52 D 部门聚会
看了题目的讨论才会做的 首先一点,算每条边(u, v)对于n*(n+1)/2种[l, r]组合的贡献 正着算不如反着算 哪些[l, r]的组合没有包含这条边(u, v)呢 这个很好算 只需要统计u这半 ...
- hihocoder [Offer收割]编程练习赛14
A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...
随机推荐
- 2017.12.1 如何用java写出一个菱形图案
上机课自己写的代码 两个图形原理都是一样的 1.一共有仨个循环 注意搞清楚每一层循环需要做的事情 2.第一层循环:是用来控制行数 3.第二层循环控制打印空格数 4.第三层循环是用来循环输出星星 imp ...
- js处理的8种跨域方法
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- idea 创建springboot工程
公司最近用springboot做微服务开发 1,使用idea创建一个spring initializr 工程 2,点击next 3,配置好后继续next 4,可以勾选上web,继续next 5,fin ...
- java面向对象思想1
1.面向对象是面向过程而言.两者都是一种思想.面向过程:强调的是功能行为.(强调过程.动作)面向对象:将功能封装进对象,强调了具备了功能的对象.(强调对象.事物)面向对象是基于面向过程的.将复杂的事情 ...
- CF873B Balanced Substring (前缀和)
CF873B Balanced Substring (前缀和) 蛮有意思的一道题,不过还是.....................因为CF评测坏了,没有试过是否可过. 显然求\(\sum[i][0] ...
- rsync常用命令和使用方法
rsync是一个远程数据同步工具,可以实现数据的增量备份,这点比scp要好,scp只能全量备份.同步可以保持文件原有属性,传输过程加密,数据传输全. rsync 的传输模式有: 1. 本 ...
- Redux百行代码千行文档
接触Redux不过短短半年,从开始看官方文档的一头雾水,到渐渐已经理解了Redux到底是在做什么,但是绝大数场景下Redux都是配合React一同使用的,因而会引入了React-Redux库,但是正是 ...
- vue插件库
各种vue插件,各种有,总有一款适合你! github地址:https://github.com/opendigg/awesome-github-vue
- OpenFaceswap 入门教程(1):软件安装篇
---恢复内容开始--- 众多换脸软件中,DeepFaceLab其实是安装和使用最方便,更新最快的,但是由于其没有可是化界面,对于很新手来说,可能入门还是有点难度.那么今天就来介绍一款操作极其直观和简 ...
- 26.VUE学习之--提交表单不刷新页面,事件修饰符之使用$event与prevent修复符操作表单
提交表单不刷新页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...