首页 > 代码库 > 概率dp总结
概率dp总结
概率:
poj 2151
有t个队伍,m道题,给出每个队伍做出每道题的概率。求出每个队伍至少做出一道题并且冠军队伍至少做出n道题的概率。
每个队伍至少做出一道题的对立事件是每队至多做出0道题,所以需要求出每对做出0道的概率。
冠军队伍至少做出n道题的概率的对立事件是所有队最多做出n-1道,所以需要记录每个队最多做出x道的概率。
那么可以设s[i][j]表示i队最多做出j道题的概率。那么还需要用dp[i][j][k]表示第i队在前j道题中做出k道题的概率。
找出对立事件就简单了。
poj 3744
有n个雷,某人的起始位置在1,每次走一步的概率为p,走两步的概率是1-p,给出n个雷的位置,问最后成功走出雷区的概率。
成功走出雷区说明每个雷区都没有踩到,那么只需求出每个雷区都没踩到的概率相乘。没踩到第i个雷区的概率是1-踩到第i个雷区的概率。可以将雷区分段1~num[1],num[1]+1~num[2]......每一段都只有一个雷num[i],每一段都是和第一段相同,dp[i]表示在i点的概率,那么dp[i] = dp[i-1]*p + dp[i-2]*(1-p)。特别注意这里的i是每一段的起始位置,每一段的第一个位置是一定要走的,dp【1】 = 1。
CF D
也是一道概率,不过需要逆推,准确找出状态的转移。
设有i只白鼠j只黑鼠的状态下王妃获胜的概率是dp[i][j],这种状态可由一下三种状态得到:
王妃第一次就取得一只白鼠获胜,概率为i/(i+j);
王妃没有取到白鼠,取黑鼠的概率是j/(i+j),若王妃要赢,下次龙一定取黑鼠,概率为(j-1)/(i+j-1),同时跑掉的是黑鼠,概率为(j-2)/(i+j-2),状态转移到dp[i][j-3];
王妃没有取到白鼠,取黑鼠的概率是j/(i+j),若王妃要赢,下次龙一定取黑鼠,概率为(j-1)/(i+j-1),同时跑掉的是白鼠,概率为i/(i+j-2),状态转移到dp[i-1][j-2];
期望:
hdu 4586
一个骰子有n个面,每个面上都有相应钱数,当掷到其中m个面上时就会增加一次机会。问最后得到钱数的期望。
这个题想复杂了,不知道终态怎么确定。其实只需要考虑投掷一次的情况,投掷一次的期望是p = sum/n,但是若投掷到m个面中的一个,就会又多一次机会,第二次投掷的情况和第一次是完全相同的,那么投掷第二次的期望就是m/n*p,依次类推,投掷N次的期望就是(m/n)^(N-1)*p。这些期望之和就是答案,可以看出N项是等比数列,极限求和。
poj 2096 期望入门题
程序的bug有n个子集,s个种类。每一个bug属于每个子集的概率为1/n,每一个bug属于每个种类的概率为1/s,问每个子集且每个种类都有bug的期望。
列出状态转移方程就就解决了。
hdu 3853
求从【1,1】到【r,c】的所花power的期望,每走一步消耗的power是2,给出从[i,j]到[i,j],[i,j+1],[i+1][j]概率。
也是简单的期望,逆推即可。特别注意在原点不动的概率为1时,根本走不到【r,c】。
hdu 4405
有n+1个点,0~n ,某人现在站在x处,若x处有flight lines,他就能飞到相应点而不用掷骰子,否则就向前走掷出的骰子上的数字。问他从0点到达n点需要投掷骰子的平均次数。
hdu 4336
有N种卡片,每一袋零食里面最多有一张卡片,给出一袋零食里面每种卡片的概率,问平均要买多少袋零食能收集到所有的卡片。
N <= 20,状态压缩一下,确定终态dp[(1<<n)-1] = 0,特别注意p1+p2+...+pN<=1,说明一袋零食中会有一张卡片也没有的情况。
状态压缩一下,共有1<<n-1个状态,设dp[sta]表示当前状态到目标状态平均买的零食数目,已知终态dp[1<<n-1] = 0,dp[sta]可由一下状态得到:
这一袋零食里没有卡片,概率为p(没有一张卡片的概率),状态转移到sta;
这一袋零食里面有卡片j,但是他已经拥有这种卡片,概率是a[j],状态转移到sta;
这一袋零食里面有卡片j,且是以前没有过的,概率是a[j],状态转移到sta | ( 1 << j )
zoj 3640类似的题型。有一个吸血鬼被困了,有n条路可以逃出去,每条路有一个难度c[],他初始的战斗力是f,对于第i条路,若f > c[i]他花t[i]天就能出去,否则,他就停留一天,同时战斗力增加c[i]然后再选一条路走出去,他走每条路的概率是相同的。问他逃出去的天数的期望。
设dp[i]表示在战斗力为i时逃出去的期望值,那么可推出状态方程 dp[i] = 1/n * t[j](c[j] > i),dp[i] = 1/n * (1+dp[ i+c[j] ] )( c[j] <= i)。易忽略的点是终态的确定,应该是MAX*2。因为i+c[j]很有可能大于MAX。
zoj 3329
很好的题目。有3个骰子,分别有a,b,c个面,每个面等概率。当前状态i,当三个面分别掷出k1,k2,k3时回到状态0,否则到达状态i+k1+k2+k3,问投掷出>=n时投掷的次数的期望,状态转移方程很好推,dp[i]=p0*dp[0]+pk*dp[i+k],仔细分析这个等式与上面的等式有所不同,它含有要求的量dp[0],出现了环。发现每个等式都可以用dp[0]表示出来,那么设dp[i]=A[i]*dp[0]+B[i],带入上式可以得到A[i]和B[i]的递推式,那么由A[0]和B[0]就能求出dp[0]。
概率dp总结