【概率与期望】hdu 4089 Activation
通道:http://acm.hdu.edu.cn/showproblem.php?pid=4089
题意:给你1个长为n的队列,然后你站在第m个位置然后题目给了你4个概率
p1:什么都不发生
p2:注册失败,第一个人到排到队尾去
p3:注册成功,第一个人离开队列
p4:机器损坏,所有注册结束
问当机器损坏时你前面的人少于k的概率是多少
思路:
{j <= i}
if(j==1) dp[i][1]=dp[i][1]*p1+dp[i][i]*p2+p4;
if(j>=2&&j<=k) dp[i][j]=dp[i][j]*p1+dp[i][j-1]*p2+dp[i-1][j-1]*p3+p4;
if(j>k) dp[i][j]=dp[i][j]*p1+dp[i][j-1]*p2+dp[i-1][j-1]*p3;
我们将方程化简一下:
if(j==1) dp[i][1]=dp[i][i]*p2/(1-p1)+p4/(1-p1);
if(j>=2&&j<=k) dp[i][j]=dp[i][j-1]*p2/(1-p1)+dp[i-1][j-1]*p3/(1-p1)+p4/(1-p1);
if(j>k) dp[i][j]=dp[i][j-1]*p2/(1-p1)+dp[i-1][j-1]*p3/(1-p1);
首先如果我们将i从1->n的话 dp[i-1][j-1]就变成了已经求过的状态既常数项那么我们可以处理,dp[i][j]=dp[i][j-1]*p2/(1-p1)+c[j],这里的c[j]=dp[i-1][j-1]*p3/(1-p1)+p4/(1-p1)(j>k时不加);解决方程的时候,我们可以看到一个环,那就是dp[i][i]与dp[i][1]的转换。那么我们就可以将他们全部转化成dp[i][i]这样就可以解了。
我拿dp[3][3]举例:
dp[3][3]=dp[3][2]*p2/(1-p1)+c[3]=(dp[3][1]*p2/(1-p1)+c[2])*p2/(1-p1)+c[3],整理一下dp[3][3]=dp[3][1]*(p2/(1-p1))^2+p2/(1-p1)*c[2]+c[3]
然后我们可以由dp[3][1]=dp[3][1]*p1+dp[3][3]*p2+p4将dp[3][1]和dp[3][3]的关系解出来代入我们就可以把dp[3][3]的值给求出来了,然后dp[3][1]也得出来了。
代码:https://github.com/Mithril0rd/Rojo/blob/master/hdu4089.cpp
TAG:期望DP