1. 程式人生 > >2018 “百度之星”程序設計大賽 - 初賽(A)1004 / hdu6377 度度熊看球賽 dp遞推

2018 “百度之星”程序設計大賽 - 初賽(A)1004 / hdu6377 度度熊看球賽 dp遞推

的確 就會 世界杯 .cn 世界 problem 產生 amp 表示

度度熊看球賽

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) ;

代碼懶得寫了~_~

2018 “百度之星”程序設計大賽 - 初賽(A)1004 / hdu6377 度度熊看球賽 dp遞推