今天学了概率dp,概率dp和平常dp的过程有点相反。
小明需要在操场顺时针跑圈打卡,操场上有两个打卡点A,B, 他需要先在A点打卡,然后在B点打卡(哪怕B点在A点前面),打完卡就可以结束跑步了,他的起点以及A,B两点的位置是随机的,告诉你操场的长度X米,求他需要跑超过K米的概率。
输入: 输出:
3
2 2 0.50
4 3 0.22
2 1 0.22
分析:
讨论x与k的大小
k>=2x 可知概率为零
x<k<2x 应该是b在a前面 离起点更近 b>k-x a>b 这个就用高中学的在直角坐标系下用面积表示概率,由于不会操作,在这里就不表示了
k<x a在b前面 b>a
k=x 由样例可知为0.50
n个地雷(n<=10)在长度10^8的坐标轴上,你可以从横坐标为1的点开始,每一步有p的概率向右跳一格,(1-p)的概率向右跳两格(不会踩到中间一格),如果踩到地雷他就会死。 问活下来的概率。
分析:
f[i]为活着经过横坐标为i的点的概率
如果点i处无地雷则f[i]=f[i-1]*p+f[i-2]*(1-p)
如果点i处有地雷则f[i]=0
拓展:
当坐标轴长度是10的18次方时
只有十个地雷 :有地雷的点的坐标为 x[1],x[2],x[3]```````x[N].
我们把道路分成N段:1~x[1]; x[1]+1~x[2]; x[2]+1~x[3]; x[N-1]+1~x[N];
这样每一段只有一个地雷。我们只要求得通过每一段的概率,然后乘法原理相乘就是答案。
对于每一段,通过该段的概率等于1-踩到该段终点的地雷的概率。
就比如第一段 1~x[1]. 通过该段其实就相当于是到达x[1]+1点。
那么p[x[1]+1]=1-p[x[1]]. 但是这个前提是p[1]=1,即起点的概率等于1.
对于后面的段我们也是一样的假设,这样就乘起来就是答案了。
对于每一段的概率的求法可以通过矩阵乘法快速求出来。
一个软件有s个子系统,会产生n种bug 某人一天发现一个bug,每个bug属于一个子系统,属于一个分类 每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n 求发现n种bug,且每个子系统都发现了bug的天数的期望。 输入: 1 2 输出: 3.00000
分析:
f[i][j]表示现在已经找到的bug有i种,属于j个系统,找完剩下所需bug的期望天数。
已知:f[n][s]=0, 而要求的答案是f[0][0]
每天有四种情况:
发现一个bug属于已经有的i个分类和j个系统。(i/n)*(j/s) * (f[i][j] +1)
发现一个bug属于已有的分类,不属于已有的系统。(i/n)*(1-j/s) * (f[i][j+1]+1)
发现一个bug属于已有的系统,不属于已有的分类。 (1-i/n)*(j/s) * (f[i+1][j]+1)
发现一个bug不属于已有的系统,不属于已有的分类。 (1-i/n)*(1-j/s) *(f[i+1][j+1]+1)
f[i][j] = (i/n)*(j/s) * (f[i][j] +1) + (i/n)*(1-j/s) * (f[i][j+1]+1) + (1-i/n)*(j/s) * (f[i+1][j]+1) + (1-i/n)*(1-j/s) *(f[i+1][j+1]+1)
这里要再整理f[i][j]
飞行棋游戏,格子从0到n,置骰子(6个面),置到几就往前走几步,但图中有可选的传送门,比如2到5有传送门的话,那你走到2时可以直接跳到5(也可以不跳),如果5到8也有传送门的话,那还可以继续跳到8,问从0到n的期望步数。 (传送门一定是从小的点到大的点,且一个点最多为一个传送门的起点)
分析:
f[i]表示在第i格走到第n格期望步数,
那么—— f[i]= 1 + 1/6 ∑ f[j] (j = i+6~i+1)
传送门怎么处理??
如果2到5有个传送门的话,其实2和5当做一个点就可以了
题意:有三个骰子,分别有k1,k2,k3个面。 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。 当分数大于n时结束。求游戏的期望步数。初始分数为0。
分析:
设f[i]表示达到i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率,
则f[i]=∑(pk*f[i+k])+f[0]*p0+1
f[i]=∑(pk*f[i+k])+f[0]*p0+1 每个状态都和f[0]有关系,
而且f[0]就是我们所求,为一个常数
设f[i]=A[i]*f[0]+B[i];
代入上述方程右边得到:
f[i]=∑(pk*A[i+k]*f[0]+pk*B[i+k])+f[0]*p0+1=
(∑(pk*A[i+k])+p0)f[0]+∑(pk*B[i+k])+1;
所以 A[i]=(∑(pk*A[i+k])+p0) B[i]=∑(pk*B[i+k])+1 先递推求得A[0]和B[0] 那么 f[0]=B[0]/(1-A[0]);
题意:有n个人排队等着在官网上激活游戏。Tomato排在第m个。 对于队列中的第一个人,有以下情况:
1、激活失败,留在队列中等待下一次激活(概率为p1)
2、失去连接,出队列,然后排在队列的最后(概率为p2)
3、激活成功,离开队列(概率为p3)
4、服务器瘫痪,服务器停止激活,所有人都无法激活了(概率为p4)。
求服务器瘫痪时Tomato在队列中的位置<=k的概率
分析:
设dp[i][j]表示i个人排队,Tomato排在第j个位置,
达到目标状态的概率(j<=i) dp[n][m]就是所求
j==1: dp[i][1]=p1*dp[i][1]+p2*dp[i][i]+p4;
2<=j<=k: dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1]+p4;
k<j<=i: dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1];