洛谷 P4550 收集邮票(概率期望dp)
传送门
解题思路
用f[i]表示已经买了i种,到买齐邮票的期望买的张数。
用g[i]表示已经买了i种,到买齐邮票的期望花的价格。
所以
- f[i]=(f[i]+1)*(i/n)+(f[i+1]+1)*((n-i)/n)
- g[i]=(g[i]+f[i]+1)*(i/n)+(g[i+1]+f[i+1]+1)*((n-i)/n)
f[i]有i/n的概率买到以前的,有(n-i)/n的概率买到新的邮票。
g[i]有i/n的概率买到以前的,而买到以前的对答案的贡献为(g[i]+f[i]+1),即原期望+买这一次的期望花费;有(n-i)/n的概率买到新的,而买到新的对答案的贡献为(g[i+1]+f[i+1]+1),即从i+1到n的期望花费+买这一次的期望花费。
再移项化简式子即可。
AC代码
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 #include<iomanip> 7 using namespace std; 8 int n; 9 double f[10005],g[10005]; 10 int main() 11 { 12 cin>>n; 13 for(int i=n-1;i>=0;i--){ 14 f[i]=f[i+1]+(double)n/(n-i); 15 g[i]=g[i+1]+(double)i/(n-i)*f[i]+f[i+1]+(double)n/(n-i); 16 } 17 cout<<fixed<<setprecision(2)<<g[0]; 18 return 0; 19 }