[CodeForces - 712D]Memory and Scores (DP 或者 生成函数)
题目大意:
两个人玩取数游戏,第一个人分数一开始是a,第二个分数一开始是b,接下来t轮,每轮两人都选择一个[-k,k]范围内的整数,加到自己的分数里,求有多少种情况使得t轮结束后a的分数比b高。 (1 ≤ a, b ≤ 100, 1 ≤ k ≤ 1000, 1 ≤ t ≤ 100)
1.我一开始的想法是DP出玩i轮得分是j的方案数。然后状态数最多有t*(2*k*t)那么多,最坏情况下会有2e7那么多的状态,转移必须是O(1)的。
dp[i][j]=sum(dp[i-1][j-k....j+k])用个前缀和维护即可。 最后求答案的时候傻逼了,觉得必须枚举最后两人的得分,就放弃了这个做法。后来看了别人的题解,其实只要枚举第一个人的最后得分,那么第二个人可行的得分是连续的一段区间,也可以用前缀和来优化。 以上记为方法一。 时间复杂度O(k*t2)
2.方法二:一个重要的转化,原题等价于一个人一开始得分是a-b,然后玩2*t轮,最后得分要求大于0的方案数。 然后就和方法一一样了。
3.方法三:利用生成函数。观察可知 $(\frac{1+x+x^2+x^3+\cdots+x^{2k}}{x^k})^{2t}$次数大于0的项的系数和即为答案。 我们只要求出分子$(1+x+x^2+x^3+\cdots+x^{2k})^{2t}$的所有次数大于$2kt$的项的系数和即可。
我们可以把分子变形:
\begin{equation}
\begin{array}{rcl}
(1+x+x^2+x^3+\cdots+x^{2k})^{2t}&=&(1-x^{2k+1})^{2t}(\frac{1}{1-x})^{2t}\\
&=&\sum_{i=0}^{2t}C_{_{2t}}^{^i}(-1)^{i}x^{(2k+1)i} \sum_{j=0}^{\infty}C_{_{2t-1+j}}^{^{2t-1}}\ \ \ \ x^j
\end{array}
\end{equation}
(1+x+x2+⋯+x2k)2t=(1−x2k+11−x)2t=(1−x2k+1)2t×1(1−x)2t=(1−x2k+1)2t×(1+x+x2+x3+x4+⋯)2t
[CodeForces - 712D]Memory and Scores (DP 或者 生成函数)的更多相关文章
- CodeForces 712D Memory and Scores
$dp$,前缀和. 记$dp[i][j]$表示$i$轮结束之后,两人差值为$j$的方案数. 转移很容易想到,但是转移的复杂度是$O(2*k)$的,需要优化,观察一下可以发现可以用过前缀和来优化. 我把 ...
- Codeforces Round #370 (Div. 2) D. Memory and Scores DP
D. Memory and Scores Memory and his friend Lexa are competing to get higher score in one popular c ...
- Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)
题目链接:http://codeforces.com/contest/712/problem/D A初始有一个分数a,B初始有一个分数b,有t轮比赛,每次比赛都可以取[-k, k]之间的数,问你最后A ...
- Codeforces Round #370 (Div. 2) D. Memory and Scores 动态规划
D. Memory and Scores 题目连接: http://codeforces.com/contest/712/problem/D Description Memory and his fr ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)
[Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...
- Memory and Scores
Memory and Scores 题目链接:http://codeforces.com/contest/712/problem/D dp 因为每轮Memory和Lexa能取的都在[-k,k],也就是 ...
- 【26.87%】【codeforces 712D】Memory and Scores
time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- Codeforces 438E The Child and Binary Tree [DP,生成函数,NTT]
洛谷 Codeforces 思路 看到计数和\(998244353\),可以感觉到这是一个DP+生成函数+NTT的题. 设\(s_i\)表示\(i\)是否在集合中,\(A\)为\(s\)的生成函数,即 ...
随机推荐
- EasyUI---tree
EasyUI的tree在获取action返回的json字符串时最少具有三个属性id.text和children,这样在读取时才会在页面正常显示树形 这里比较重要的就是在数据库中对数据的存储吧,说白了还 ...
- Java方法trim()小记
我们一般用trim()方法的主要作用,是为了去除字符串的首尾空格.然而根据我个人的实践经验发现,trim()这个方法只能去除部分的空格或空白符,比如半角空格:对于全角空格的话,用trim()并不能去除 ...
- window 配置wnmp(转下整理 ,全)
工具/原料 RunHiddenConsole.exe 下载地址:http://pan.baidu.com/share/link?shareid=100074&uk=822373947 方法 ...
- 打包发布WinForm应用程序
1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) 此主题相关图片如下: 2:安装向导 点击下一步, ...
- JavaScript中有关数字的精确计算
问题这样的: 37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) ,我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会 ...
- 常见的js 里对数字进行处理的函数方法集合
常见的对小数值舍入为整数的几个方法:Math.ceil().Math.floor()和Math.round(). 这三个方法分别遵循下列舍入规则: Math.ceil()执行向上舍入,即它总是将数值向 ...
- (十六)getsockname()
简述: 获取一个套接口的本地名字. #include <winsock.h> int PASCAL FAR getsockname( SOCKET s, struct sockaddr F ...
- Linux 命令——简约汇总
1. 更改档案拥有者 命令 : chown [-cfhvR] [--help] [--version] user[:group] file... 功能 : 更改文件或者文件夹的拥有者 参数格式 : ...
- contiki-rtimer
struct rtimer { rtimer_clock_t time; rtimer_callback_t func; void *ptr; }; typedef unsigned short rt ...
- vscode 与 python 的约会
安装python 官网(https://www.python.org/downloads/)下载, 安装. (简单略过). 运行python代码 运行python代码的常见方式有三种: 运行pytho ...