题设:
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-22)+2N(4,1,1,2)=482+2*12=120
OK,至此,整个dp的思路应该说的比较清楚了。
https://www.douban.com/note/269136472/
安排座位不相邻
最新推荐文章于 2021-03-29 22:53:55 发布