P4550-收集邮票【期望dp】
前題
ZYCdalaoZYCdalaoZYCdalao讓我推這題,然后我只推出了fff的推導(dǎo),我還是太菜了QVQQVQQVQ
正題
題目鏈接:https://www.luogu.org/problemnew/show/P4550
題目大意
nnn種,每次隨機(jī)買一個(gè)郵票(每種的概率均等),然后第kkk種要kkk元,求收集完所有郵票需要的期望錢數(shù)。
解題思路
首先設(shè)gig_igi?表示購買iii個(gè)郵票,買完剩下的郵票需要的期望錢數(shù),我們發(fā)現(xiàn)因?yàn)橛?span id="ozvdkddzhkzd" class="katex--inline">kkk,我們很難計(jì)算答案,但我們可以將費(fèi)用推后計(jì)算。先設(shè)fif_ifi?表示拿到了iii個(gè),要取完剩下的郵票需要購買的期望次數(shù)(倒推),那么有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?
然后我們考慮如何推導(dǎo)gig_igi?,我們每次有in\frac{i}{n}ni?的概率買到已經(jīng)有了的,有n?in\frac{n-i}{n}nn?i?的概率買到?jīng)]有的,因?yàn)橘M(fèi)用推后計(jì)算,所以每次后面取到的費(fèi)用都會(huì)+1+1+1,所以現(xiàn)在的費(fèi)用就是之前的購買次數(shù)加上原來的費(fèi)用fi+1f_{i}+1fi?+1,那么加上前面的購買費(fèi)用就是gi+fi+1g_i+f_i+1gi?+fi?+1
那么推導(dǎo)
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]); }總結(jié)
以上是生活随笔為你收集整理的P4550-收集邮票【期望dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家里的旧电脑家里的旧电脑显示器怎么处理
- 下一篇: jzoj3236-矮人排队【权值线段树】