[TopCoder SRM420 Div1 500pt RedIsGood]【数学期望】【动态规划】

【题意】

给你R张红牌,B张黑牌。

全翻过去。你每次可以选择翻开一张牌或者结束游戏。

翻开一张红牌你可以的1块钱,黑牌掉1块钱。

问假设你绝顶聪明,你得到的钱数是数学期望是多少?

【算法】

本来觉得红牌多就继续取,黑牌多不取了就是最优策略。

然后有个样例  11 12,期望居然>1。这才猛然发现可以通过见好就收的策略使得期望>0,于是就囧了。

解法是F[i][j]表示剩下i张红牌,j张黑牌,你绝顶聪明时的期望。

那么你怎么才叫聪明呢- -,当然是翻了以后,你继续聪明,得分的数学期望>0,那么就跑去翻,这样才叫聪明啊...

于是F[0][0]=0

F[i][j]=F[i-1][j]+1   (j=0)

F[i][j]=0                (i=0)

F[i][j]= max(  (F[i-1][j]+1)*(i/(i+j))  +  (F[i][j-1])*(j/(i+j))   ,   0   )

最后F[R][B]就是期望...

要用滚动数组优化一下。

【CODE】

 http://ideone.com/tfZ9a

[SGU385 Highlander]【数学期望】【组合数学】【动态规划】

【题意】

输入n,求在所有错位排列中,在最长循环节上点的数目(如果有多个最长循环节,那么这些上面的点都要算)的期望值。

每个错排都是等概率的。

【算法】

论文上的题...写出来加深印象+方便回看。

因为是排列,而且是错排,所以可以看成无自环的多个独立环拼成的图。

F[i][j][k]表示选了i个数里面最长循环节是j,有k个最长循环节时的方案数。

令G[i][j]=Sum(F[i][0..j][k])

初始化F[0][0][0]=1。

F[i][j][k]=

{

G[i-j][j-1]*P(n-i+j,j)/j      k=1           就是在剩下的n-i+j个数里取j个,得到一个长度为j的排列,但是由于是环,可以循环一圈当同样的,所以/j

F[i-j][j][k-1]*P(n-i+j,j)/j/k   k>1      前面和上面一样.后面的/k是把这k个等长的环的顺序上的重复干掉。

}

最后答案就是Sum( F[n][j][k]*j*k ) / d 

d是错排数目。

【CODE】

https://ideone.com/lIAQX