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

代码懒得写了~_~

原文地址:https://www.cnblogs.com/sbfhy/p/9464047.html

时间: 2024-10-08 21:39:13

2018 “百度之星”程序设计大赛 - 初赛(A)1004 / hdu6377 度度熊看球赛 dp递推的相关文章

2018 “百度之星”程序设计大赛 - 初赛(A)度度熊学队列 list rope

c++ list使用 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <time.h> 6 #include <string> 7 #include <set> 8 #include <map> 9 #include <list> 10 #include <e

2017&quot;百度之星&quot;程序设计大赛 - 初赛(B)度度熊的交易计划

n个村庄m条带权路,权值为花费,村庄可以造东西卖东西,造完东西可以换地方卖,给出每个村庄造东西花费a和最多个数b.卖东西价值c和最多个数d,求最大收益. 裸的费用流.然而还WA了一发.很好. 建源向每个村庄连边(b,a),(b,a)表示容量b费用a,每个村庄向汇点连边(d,-c),村庄间有路就互相连边(inf,v),v为边权,然后就是最小费用流. 不是最小费用最大流!!把费用最大流SPFA中最后一句判断改成<0即可,因为>=0时的费用可以不要他. 1 #include<stdio.h&g

2017&quot;百度之星&quot;程序设计大赛 - 复赛1003&amp;&amp;HDU 6146 Pok&#233;mon GO【数学,递推,dp】

Pokémon GO Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 171    Accepted Submission(s): 104 Problem Description 众所周知,度度熊最近沉迷于 Pokémon GO. 今天它决定要抓住所有的精灵球! 为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都

2018 “百度之星”程序设计大赛 - 初赛(A)

第二题还算手稳+手快?最后勉强挤进前五百(期间看着自己从两百多掉到494名) 1001  度度熊拼三角    (hdoj 6374) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6374 签到题 题意:给n根木棒 求可以拼出的周长最长的三角形 可以用贪心的思想做 对所有的木棒长度进行排序 取最长的三根进行判断是否可以组成三角形 若不能 舍去最长的一根 每次都选择相邻的三根 for一遍就好 复杂度为O(nlogn) 代码如下 #include <ios

2018 “百度之星”程序设计大赛 - 初赛(B)

degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description 度度熊最近似乎在研究图论.给定一个有 NN 个点 (vertex) 以及 MM 条边 (edge) 的无向简单图 (undirected simple graph),此图中保证没有任何圈 (cycle) 存在. 现在

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

2014年百度之星程序设计大赛 - 初赛(第二轮)

1001 暴力 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 100100; int ll[maxn], rr[maxn]; struct node { int x, y, bj; }e[maxn]; int main() { int cas = 1; int T; scanf("%d", &T);

2014年百度之星程序设计大赛 - 初赛(第二轮)Chess

题目描述:小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个. 小度觉得每次都是小良赢,没意思.为了难倒小良,他想出

2017&quot;百度之星&quot;程序设计大赛 - 初赛(A)

2017"百度之星"程序设计大赛 - 初赛(A) hdu6108    求出 n-1 的因子个数即可 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b;