P4550-收集邮票【期望dp】
前題
ZYCdalaoZYCdalaoZYCdalao讓我推這題,然后我只推出了fff的推導,我還是太菜了QVQQVQQVQ
正題
題目鏈接:https://www.luogu.org/problemnew/show/P4550
題目大意
nnn種,每次隨機買一個郵票(每種的概率均等),然后第kkk種要kkk元,求收集完所有郵票需要的期望錢數。
解題思路
首先設gig_igi?表示購買iii個郵票,買完剩下的郵票需要的期望錢數,我們發現因為有kkk,我們很難計算答案,但我們可以將費用推后計算。先設fif_ifi?表示拿到了iii個,要取完剩下的郵票需要購買的期望次數(倒推),那么有n?in\frac{n-i}{n}nn?i?的概率買到正確的郵票,有in\frac{i}{n}ni?的概率買到之前買過的郵票
fi=n?in?fi+1+in?fi+1f_i=\frac{n-i}{n}*f_{i+1}+\frac{i}{n}*f_i+1fi?=nn?i??fi+1?+ni??fi?+1
fi=n?in?fi+1+in?fi+1f_i=\frac{n-i}{n}*f_{i+1}+\frac{i}{n}*f_i+1fi?=nn?i??fi+1?+ni??fi?+1
n?in?fi=n?in?fi+1\frac{n-i}{n}*f_i=\frac{n-i}{n}*f_i+1nn?i??fi?=nn?i??fi?+1
fi=fi+1+nn?if_i=f_{i+1}+\frac{n}{n-i}fi?=fi+1?+n?in?
然后我們考慮如何推導gig_igi?,我們每次有in\frac{i}{n}ni?的概率買到已經有了的,有n?in\frac{n-i}{n}nn?i?的概率買到沒有的,因為費用推后計算,所以每次后面取到的費用都會+1+1+1,所以現在的費用就是之前的購買次數加上原來的費用fi+1f_{i}+1fi?+1,那么加上前面的購買費用就是gi+fi+1g_i+f_i+1gi?+fi?+1
那么推導
gi=in(gi+fi)+n?in(gi+1+fi+1)+1g_i=\frac{i}{n}(g_i+f_i)+\frac{n-i}{n}(g_{i+1}+f_{i+1})+1gi?=ni?(gi?+fi?)+nn?i?(gi+1?+fi+1?)+1
gi=in?gi+in?fi+n?in(gi+1+fi+1)+1g_i=\frac{i}{n}*g_i+\frac{i}{n}*f_i+\frac{n-i}{n}(g_{i+1}+f_{i+1})+1gi?=ni??gi?+ni??fi?+nn?i?(gi+1?+fi+1?)+1
n?ingi=in?fi+n?in(gi+1+fi+1)\frac{n-i}{n}g_i=\frac{i}{n}*f_i+\frac{n-i}{n}(g_{i+1}+f_{i+1})nn?i?gi?=ni??fi?+nn?i?(gi+1?+fi+1?)
gi=in?i?fi+gi+1+fi+1+1g_i=\frac{i}{n-i}*f_i+g_{i+1}+f_{i+1}+1gi?=n?ii??fi?+gi+1?+fi+1?+1
overoverover
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=11000; double n; double f[N],g[N]; int main() {scanf("%lf",&n);for(int i=n-1;i>=0;i--){f[i]=f[i+1]+(double)n/(n-i);g[i]=(double)(f[i]+1)*i/(n-i)+g[i+1]+f[i+1]+1;}printf("%.2lf",g[0]); }總結
以上是生活随笔為你收集整理的P4550-收集邮票【期望dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家里的旧电脑家里的旧电脑显示器怎么处理
- 下一篇: 库克回应 Mac 业务营收同比下降 34