【概率与期望】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

posted @ 2014-10-26 21:25  mithrilhan  阅读(153)  评论(0编辑  收藏  举报