n个人排队,T在第m个位置,对于队列第一个人有以下四种情况:
1、激活失败,留在队列中等待下一次激活(概率为p1)
2、失去连接,出队列,然后排在队列的最后(概率为p2)
3、激活成功,离开队列(概率为p3)
4、服务器瘫痪,服务器停止激活,所有人都无法激活了。
求服务器瘫痪时T在队列中的位置<=k的概率
dp[i][j]表示i个人排队,T站在j位置时的:最终瘫痪符合条件的概率
转移方程比较好想,程序里面也有
1 //j=1 dp[i][j]=p1*dp[i][j]+p2*dp[i][i]+p4;2 //j=[2,k] dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1]+p4;3 //j=[k+1,i] dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1];
关键在第一个方程用到了最后一个变量,表面上形成了环,实际上设最后一个为x,循环迭代代代代就解出dp[i][i]然后再回来接触dp[i][1-j]==
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 #define eps 1e-8 7 //j=1 dp[i][j]=p1*dp[i][j]+p2*dp[i][i]+p4; 8 //j=[2,k] dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1]+p4; 9 //j=[k+1,i] dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1];10 double dp[2005][2005],p[2005],p_jie[2005],c[2005];11 int main()12 {13 int n,m,k,i,j;14 double tp,p[5],tmp;15 while (~scanf("%d%d%d",&n,&m,&k))16 {17 for (i=1;i<=4;i++) scanf("%lf",&p[i]);18 19 if (p[4]
题目链接: