洛谷 P4550 收集郵票(概率期望dp)
阿新 • • 發佈:2020-10-31
傳送門
解題思路
用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 }