有m个人同时参加了n场比赛,然后每一场比赛有个rank,rank没有重复,然后现在计算总rank,
首先一个人的总分数等于他的n场比赛的rank之和,
然后一个人的总排名等于总分数比他少的人的个数+1
(这个时候总的rank就有可能有重复了)
然后现在一个人的n场比赛的rank分别是a1,...,an,(1<=ai<=m),然后问他的总rank的期望值
n<=100,m<=1000
首先直接计算期望值肯定是很难的,我们转化一下,他的总分数固定了,求总分数比他小的人的期望值e,
那么他的期望值就是e + 1了。
f(i,j)表示前i场比赛,总分数为j的人数的期望
f[101][101*1000]
f(0,0) = m - 1
在递推的过程我们只需要考虑m-1个人,这个固定了的人就不用管了。
注意a[i]的位置被他占据了,这个位置不能放其他人了。
考虑f(i,j),现在我们知道前i场比赛分数为j的人有f个了,对于第i+1场的k(k != a[i+1])这个分数,
m-1个人每一个人在这个位置的概率都是1/(m-1),所以这f个人中有人在这个位置的概率是
f/(m-1),然后对f(i+1,j+k)的贡献就是1 * f/(m-1)了
然后这个递推过程也非常好,但是复杂度是O(m*n^3)的
发现递推可以用前缀和优化,
f(i,j)表示前i场比赛,总分数<=j的人数的期望就可以了
O(m*n^2)