思路
本题我们定义dp[i][j]为队伍中有i个人Tomato排在第j个时,服务器崩溃且排在他前面的人有大于等于k个人的概率。
一共有三个转移方程(注意是逆推):
- dp[i][1]=p1*dp[i][1]+p2*dp[i][i]+p4,因为要求无后效性,化简可得dp[i][1]=p2/(1-p1)*dp[i][i]+p4/(1-p1)
- 对j属于[1,k]有:dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1]+p4,同样因为要求无后效性,化简可得dp[i][j]=p2/(1-p1)*dp[i][j-1]+p3/(1-p1)*dp[i-1][j-1]+p4/(1-p1)
- 对j属于[k+1,n]有:dp[i][j]=p1*dp[i][j]+p2*dp[i][j-1]+p3*dp[i-1][j-1],化简可得dp[i][j]=p2/(1-p1)*dp[i][j-1]+p3/(1-p1)*dp[i-1][j-1]
接下来我们发现这个dp转移方程。。构成了一个环?不过这道题并没有用到高斯消元,我们将dp转移中第j项与dp[i]即当前状态无关的令为一个常数c[j],然后对第一个方程迭代。我们最后化简可得如下式子:
然后我们用转移方程求出所有dp[i]的状态,然后dp[n][m]就是答案。这题有个比较奇怪的点,似乎如果不对p4约等于0的情况进行特判会出问题?不是很懂为什么。。
代码
1 |
|