安排座位不相邻

题设:
n个系,输出不相邻排列的组合数,n个系的所有学生都要坐到座位上。
解析:
《1》n个系,按照最终人数由少到多排列为a1,a2,…,an
令N(c,b1,b2,…,bn)表示在{b1,b2,…,bn}人数时,同系学生两两分割的排列数,其中c=b1+b2+…+bn。
《2》来了第c+1位x系的同学,不妨设x=n系,现在N(c+1,b1,b2,…,bn+1)如何递归推导出来?
2.1 原来c位排列好的序列中,共有c+1个空格可供排入,但不能与bn位系友相邻,故有c+1-2bn个位置。
2.2某个位置左右两位来自一个系,此时,对n系外的n-1个系逐一检查,如果其中任何一个系大于等于2个同学来参加聚会,则都应予以考虑。
《3》故递归方式如下:
N(c+1,b1,b2,…,bn+1)=N(c,b1,b2,…,bn)(c+1-2bn)+2[N(c-1,b1-1,b2,…,bn)+N(c-1,b1,b2-1,…,bn)+…+N(c-1,b1,b2,…,bn-1-1,bn)]
《4》很明显,边界条件为N(c,1,1,…,1)=c!,且N中任意一项若小于等于0,则N为0。
以N(6,1,2,3)来举例说明:
N(3,1,1,1)=3!=6,
N(4,1,2,1)=N(3,1,1,1)(4-2)=12=N(4,1,1,2)
需要说明的一点是,任意非递增序列的N数值上与递增序列相等,即N(4,1,2,1)=N(4,1,1,2),但要保持序列的对应关系。这点计算上的技巧接下来就会碰到。
《5》N(5,1,2,2)=N(4,1,2,1)(5-2)+2N(3,1,1,1)=123+26=48
N(6,1,2,3)=N(5,1,2,2)(6-2
2)+2N(4,1,1,2)=482+2*12=120
OK,至此,整个dp的思路应该说的比较清楚了。
https://www.douban.com/note/269136472/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值