2018 “百度之星”程序设计大赛 - 初赛(A)1004 / hdu6377 度度熊看球赛 dp递推
度度熊看球赛
Problem Description
世界杯正如火如荼地开展!度度熊来到了一家酒吧。
有 N 对情侣相约一起看世界杯,荧幕前正好有 2×N 个横排的位置。
所有人都会随机坐在某个位置上。
当然,如果某一对情侣正好挨着坐,他们就会有说不完的话,影响世界杯的观看。
一般地,对于一个就座方案,如果正好有 K 对情侣正好是挨着坐的,就会产生 DK 的喧闹值。
度度熊想知道随机就座方案的期望喧闹值。
为了避免输出实数,设答案为 ans,请输出 ans×(2N)! mod P 的值。其中 P=998244353
Input
有多组数据(不超过 1000 组),读到EOF结束。
对于每一组数据,读入两个数 N 和 D 。
1≤N,D≤1000
Output
对于每一组数据,输出一个数表示答案。
Sample Input
1 10
2 3
Sample Output
20
104
题解:
官方题解其实已经解释得很好了,这样 dp 的确很巧妙。
dp[i][j] 表示前 i 对情侣,有 j 对坐在一起的方案数。
首先为了简便,我们把每对情侣中两个人看作是相同的两个人,最后乘上 2^n 即可。
最后要求 ans×(2N)!,也就是求出 i 对情侣坐位所有不同方案数。
然后由前 i 对递推转移到前 i+1 对 :
1、第 i+1 对在一起:
(1)第 i+1 对插入进另一对中间, dp[i+1][j] += dp[i][j] * j ;
(2)第 i+1 对不插入另一对中间,dp[i+1][j+1] += dp[i][j] * (2*i+1-j) ;
2、第 i+1 对不在一起:
(1)第 i+1 对的两个人分别插入另外两对中间,dp[i+1][j-2] += dp[i][j] * C(j,2) ;
(2)第 i+1 对的两个人只有一个人插入到另一对中间,dp[i+1][j-1] += dp[i][j] * C(j,1) ;
(3)第 i+1 对的两个人都不插入其它对里,dp[i+1][j] += dp[i][j] * C(2*i+1-j, 2) ;
代码懒得写了_