题意:
摇一个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]);}
}