1. 程式人生 > 實用技巧 >洛谷 P4550 收集郵票(概率期望dp)

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