spoj Favorite Dice(概率dp+期望)

题意:

摇一个n面的骰子,问每一面都被摇到的次数期望是多少。

题解:

概率dp往往都是倒着推
我们设dp[x]表示已经摇到了x个面,还要摇的概率次数
那么dp[n] = 0(即一次还没摇)
dp[0]就是答案
对于dp[i],我们考虑当前已经摇到i个面,动态规划要考虑状态,上一个状态可能是也是摇到了i个面(即本次摇的面已出现过),也可能是摇到了i-1个面(即本次摇的面第一次出现)
(1)扔到已经扔过的面求出的期望就是i/n *dp[i]
(2)扔到没扔过的面的期望就是 (n-i)/n *dp[i+1]
所以递推式为:
dp[i] = i/n *dp[i]+(n-i)/n *dp[i+1] +1.
两边都是dp[i]化简一下:
dp[i]=dp[i+1]+n/(n-i)

代码:

#include<bits/stdc++.h>
using namespace std;
double dp[1010];
int n;
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--){
    
    
        scanf("%d",&n);
        met(dp,0.0);
        for(int i=n-1;i>=0;i--)
            dp[i]=dp[i+1]+n*1.0/(n-i);
            printf("%.2lf\n",dp[0]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35975367/article/details/114701331