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

题目

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

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

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

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

考虑某个合法的播放列表 a1,a2,,aN,用 pi 表示第 i新数(即前面没出现过的数)所在的位置(即格子编号)显然有 p1=1p2=2,并且 ap1,ap2,,apN 构成 1N 的一个排列。

考虑映射 a1,a2,,aNap1,ap2,,apN

不难看出,根据上述映射可将所有合法的播放列表分成 N! 类,且每一类中的排列个数相等,将此数目记为 g(N1,LN) 。对于 i=2,4,,N,令 di=pi+1pi1dN+1=L+1)通过枚举 d2,,dN,我们可以给出 g(N1,LN) 的表达式
(1)d2,,dNi=2Ndi=LNi=2N(i1)di
那么有
(2)g(m,n)=d1,,dmidi=ni=1midi

关于 g(m,n),容易得到如下递推式
(3)g(m,n)=g(m1,n)+ng(m,n1)
边界条件:g(1,n)=1,,f(m,0)=1
此式的组合意义可以如此理解:第一项 g(m1,n) 对应于 dm=0 的情形,第二项 ng(m,n1) 对应于 dm>0 的情形。

我想知道 (2) 式能否进一步化简。

枚举 d1,,dm such that idi=n,对应着 ordered partition

posted @   Pat  阅读(159)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 《HelloGitHub》第 108 期
历史上的今天:
2017-11-18 Codeforces 891 C Envy
2017-11-18 可持久化并查集
2015-11-18 最小圆覆盖(Smallest Enclosing Discs)
点击右上角即可分享
微信分享提示