ACM暑期集训22

今天学了概率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];

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值