一个n面的骰子,求期望掷几次能使得每一面都被掷到
优惠券收集者问题
f[i]表示已掷到i面,还期望掷多少面才能使每一面都掷到
有\(\frac in\)的概率掷到已掷到的,\(\frac{n-i}f\)的概率掷到未掷到过的
所以\(f[i]=\frac in \times f[i] +\frac {n-i}n \times f[i+1]+1\)
即\(掷到已掷到的概率\times已掷到i面还期望掷的次数+掷到未掷到的概率\times掷到i+1面还期望掷的次数\)至少得掷一次所以后面+1
化简得\(f[i]=f[i+1]+\frac n{n-i}\)
#include <iostream>
using namespace std;
const int N=10000+5,M=20000+5,inf=0x3f3f3f3f,P=19650827;
int n;double f[N];
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int main(){
// freopen("in2.txt","r",stdin);
//freopen("xor.out","w",stdout);
int T;rd(T);
while(T--){
rd(n);f[n]=0;
for(int i=n-1;i>=0;--i) f[i]=f[i+1]+(double)n/(n-i);
printf("%.2lf\n",f[0]);
}
return 0;
}
【SPOJ1026】FAVDICE - Favorite Dice[概率dp]
原文:https://www.cnblogs.com/lxyyyy/p/11397812.html