洛谷 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 }

 

posted @ 2020-10-31 20:04  尹昱钦  阅读(110)  评论(0编辑  收藏  举报