给定n种物品,每次购买会随机买到一种,询问买到n种物品的期望次数
我们考虑,当我们已经买到k种物品了,我们再继续买多少次能得到第k+1种物品
这个很好求吧,是nn−k次(参考预备知识中的期望是概率的倒数)
那么ans=n∑ni=11n
http://www.lydsy.com/JudgeOnline/problem.php?id=1426
有n种邮票,当你买第k张时(不是第k种!!!)花费k元,询问集齐n种的期望花费是多少
f[i]:集齐i种的购买次数
g[i]:集齐i种的花费大小
f[i]=f[i−1]+nn−i+1
g[i]=g[i−1]+(f[i−1]+1)∗n−i+1n+(f[i−1]+1+f[i−1]+2)∗i−1n∗n−i+1n
经过两次等比数列求极限得到下式(推得好麻烦就不放了)
g[i]=g[i−1]+f[i−1]∗nn−i+1+(nn−i+1)2
其实期望是概率的倒数就是通过等比数列求极限得到的
CODE
给定n,每次等概率从小于n的所有素数中取一个p,若p|n则n/=p,否则不变,直到n变为1,询问平均选素数的次数
设dp[i]:表示从n=i开始选dp[i]次i变为1
sum[i]:表示1 ~ i的素数个数
http://acm.hdu.edu.cn/showproblem.php?pid=4405
从0开始走每次可以跳{1,2,3,4,5,6}格,均花费时间1,有些点有传送门回传送到后面的点上,走传送门不花时间,询问走到>=n的格子的时间期望
DP方程都很显然,但是会出现两个点的传送门到同一个格子,正着推并不好写
所以,我们转化成从n跳回<=0的期望求就好了
CODE
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1470
要求摆放n块骨牌,但摆放时会有pl的概率放的这块的左边所有挨着的骨牌都倒下,同理右边的概率为pr(1−pl−pr>0)
询问摆完n块的期望次数
我们考虑将两堆摆好的骨牌合并,即[1..i−1]和[i+1..n]已经被摆好,现在我们要把第i块放进去,[1..i−1]被摆好的期望为E1,[i+1..n]为E2
分为往左倒的期望次数∗E1+往右倒的期望次数∗E2+不倒的期望次数∗1
不倒的期望次数很明显就是概率的倒数11−pl−pr
不倒的期望代表了什么?代表了到这步之前都是倒的!
也就是说往左倒和往右倒的次数和为11−pl−pr−1=pl+pr1−pl−pr
要么往左倒要么往右倒,那么往左倒的概率为pl+pr1−pl−pr∗plpl+pr=pl1−pl−pr,同理往右倒的概率为pr1−pl−pr
E=pl1−pl−prE1+pr1−pl−prE2+11−pl−pr
注意还要加上合并两块之前,两块各自摆好的期望次数E1+E2
dp[i]:摆好连续i块骨牌的期望次数
dp[i]=min(dp[i],1−pr1−pl−prdp[j]+1−pl1−pl−prdp[i−j−1]+11−pl−pr)
这个复杂度可以利用dp值(期望)的单调性从O(N2)降到O(N)但与本文无关不再赘述
CODE
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1670
给定n个怪兽的能量值(均在[0,n−1]),人的初始能量值为0,若人的能量>=怪兽的能量就能打败,求死亡的期望能量值
dp[i]:第i轮结束后人依然没死的方案数
sum[i]:能量值<=i的怪兽数
方案也是满足概率条件的
有多大概率死亡就有多大概率的方案就此终结掉
dp[i]=dp[i−1]∗sum[i−1]−i+1n−i+1
dp[i−1]−dp[i]:死亡时能量值为i−1的方案数
ans=∑(dp[i−1]−dp[i])∗(i−1)=∑dp[i]
这类要处理出活着的状态而不是死的状态,因为一死,状态就无法转移了(不能再继续)
CODE
http://poj.org/problem?id=2096
有s个系统,n种病毒(病毒个数是无限的),每天只能查出一种病毒
询问找齐n种病毒且每个系统中至少包含一个病毒的期望天数
设dp[i,j]:已经找到了i个系统,j种病毒,还需要的期望天数
dp[i,j]=dp[i+1,j]∗s−is∗jn+dp[i,j+1]∗n−jn∗is+dp[i+1,j+1]∗s−is∗n−jn+dp[i,j]∗is∗jn
为什么不设dp[i,j]为找到i个系统j种病毒的期望天数?
因为最终的答案为dp[s,n],会除以0,只能求极限来实现,所以不用
CODE
有n个有聊的人和m个无聊的人,每次从这n+m个人中选出2个变成无聊的人,询问n+m个人都变为无聊的期望次数
dp[i]:n+m个人中有i个有聊的,将i个都变为无聊的期望次数
$dp[i]=dp[i-1]\frac{i(n+m-i)}{C_{n+m}^{2}}+dp[i-2]\frac{C_{i}^{2}}{C_{n+m}^2}+dp[i]\frac{C_{n
+m-i}^2}{C_{n+m}^{2}}+1$
CODE
http://cojs.tk/cogs/problem/problem.php?pid=1487
初始有k只生物,这种生物只能活一天,死的时候有Pi的概率产生i只新生物(也只能活一天),询问m天后所有生物都死的概率(包括m天前死亡的情况)
首先每只生物间互不影响,所以我们只考虑初始有1只的情况
dp[i]:前i天内所有生物都死的概率
dp[i]=∑n−1j=0pj∗(dp[i−1])j
枚举第一天可能生几只,然后第一天到第i天的情况就是dp[i−1]了
ans=(dp[m])k
CODE
这题与下题有相似之处
他们都枚举的是第一次而不是最后一次,因为最后一次已经被前面限制住了,而第一次是没有的
http://www.lydsy.com/JudgeOnline/problem.php?id=1419
有n张+1和m张−1,可以中途停止拿牌,询问按照最优拿牌,最后的得分期望
由于有决策存在,所以要满足最优子结构,而期望正是能用来表示该状态的好坏的
继续翻牌的期望小于0,莫不如不取
设dp[i,j]:有i张+1和j张−1的期望得分
不拿期望是0,拿牌的话我们现在的状态是i张+1,j张−1,第一张+1的概率是ii+j−1的概率是ji+j
dp[i,j]=max(0,(dp[i−1,j]+1)∗ii+j+(dp[i,j−1]−1)∗ji+j)
dp[0,j]=0 dp[i,0]=i
CODE
http://www.lydsy.com/JudgeOnline/problem.php?id=1415
给定一张无向图,两个点A和B,每次A都向着离B最近的方向走,如果有两个点都可以,走编号小的那个,A如果走一次没遇到可以在这个时间内再走一步,B每次可以留在原来的点或者等概率走相邻的点,询问A遇到B的期望时间
每次走最近相同走编号最小,我们先O(N2)处理出path[i,j]:A在i,B在j,A下一步走到哪里
du[i]:点i的度数
dp[i,j]:A在i,B在j相遇的期望时间
http://www.lydsy.com/JudgeOnline/problem.php?id=4204
初始标号为i的球有ai个,(i∈[1,n]),有m个球,每次等概率取出一个,假设编号为s,若s<n,则s=s+1,否则s=1
询问进行k次后最终每个编号的球的期望个数
dp[i]:编号为i的球的个数
dp[i]=dp[i]+dp[i−1]∗1m−dp[i]∗1m
dp[i]=dp[i−1]∗1m+dp[i]∗m−1m
用矩阵优化k变为logk
但还是超时,比较n=1000,转移矩阵太大
我们来看一下转移矩阵
⎡⎣⎢⎢⎢⎢⎢dp[n]dp[n−1]⋮dp[1]⎤⎦⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢(m−1)/m0⋮1/m1/m(m−1)/m⋮001/m⋮⋯⋯⋯⋱000⋮(m−1)/m⎤⎦⎥⎥⎥⎥⎥k∗⎡⎣⎢⎢⎢⎢⎢dp[n]dp[n−1]⋮dp[1]⎤⎦⎥⎥⎥⎥⎥
我们发现是个循环矩阵(从第2行开始都是由第一行向右移一位得到的),并且循环矩阵的幂次仍是循环矩阵,所以我们只需要算出第一行即可O(N2logk)
tempmatrix[i]+=matrix[j]∗matrix[(j−i+n) % n+1]
CODE
http://www.lydsy.com/JudgeOnline/problem.php?id=2318
有n枚石子,A先手拿,每次抛硬币,正面就取出一枚石子,否则不操作
A有p的概率抛出自己期望的那一面,B有q的概率抛出自己期望的那一面
询问A获胜的概率
设f[i]:剩i枚石子A先手拿的胜率
设g[i]:剩i枚石子A后手拿的胜率
A先手,如果A想拿石子,f[i]=p∗g[i−1]+(1−p)g[i]
A后手,如果B想拿石子,g[i]=q∗f[i−1]+(1−q)f[i]
f[i]=p∗g[i−1]+(1−p)q∗f[i−1]1−(1−p)(1−q)
g[i]=q∗f[i−1]+(1−q)p∗g[i−1]1−(1−p)(1−q)
对于同一时间,A(