bzoj1426 收集郵票
題目描述:
有n種不同的郵票,皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那裏購買,每次只能買一張,並且買到的郵票究竟是n種郵票中的哪一種是等概率的,概率均為1/n。但是由於凡凡也很喜歡郵票,所以皮皮購買第k張郵票需要支付k元錢。
現在皮皮手中沒有郵票,皮皮想知道自己得到所有種類的郵票需要花費的錢數目的期望。
N<=10000
題解:
k張k元不好做,先考慮每張都是1元怎麽做。
設f[i]表示,已經有了i種,買到n種的期望步數,也就是期望花費。
f[i]=(i/n)*(f[i]+1) + (n-i)/n*(f[i+1]+1) ; ( i<n)
f[n]=0;
就是說,i/n的概率買到之前買過的郵票,(n-i)/n的概率買到新的郵票。
期望=概率*結果。理解上就是,這樣的概率i/n,(n-i)/n,到達了這樣的結果。就可以推出來了。
因為這個f數組,可以表示期望的步數,非常有用。以下講解繼續沿用。
然後,對於k張k元的情況,有兩種做法:
(都要通過 期望=概率*事件的結果取值 來理解)
①(理解麻煩,過程簡單)
設g[i]表示,從有了i種有郵票到買到n種郵票要花的錢數。
f[i]還和上面的一樣。
所以,g[i]的轉移是:
g[i]=i/n*(g[i]+f[i]+1)+(n-i)/n*(g[i+1]+f[i+1]+1)
g[n]=0;
比較難以理解。
解釋:
i/n是買到自己原來買過的概率。
該種情況下,到達的結果是,還要有的g[i]花費,並且,之後期望還要買的f[i]次價格都上漲了1,總體加了f[i],再加上這次的1花費。
為什麽可以認為,這一次是第一次買,花費是1呢??
我們在狀態中,默認已經有了i張(從天上掉下來的,不花錢),所以,第一次買就是1元了。
或者,因為我們最後要求的是g[0],
對於g[0],第一次買花費1肯定是成立的。
所以,我們之後的所有花費,都默認第一次是1,之後計算還會加上的。
畫圖理解一下,g[i]的組成,黑色部分是的g[i],紅色一道是增加了總體的f[i], 綠色一個點是這次操作花費的1元。
而相鄰的g[i+1]->g[i]的更新時類似的。因為都加上了一個f[i+1]麽,所以g[i+1]的花費1也就變成了花費2了。
之後拆開括號,移項,然後直接求。
②(理解簡單,過程麻煩)
發現,假設買了k張郵票,花費就是:(k^2+k)/2 ----------------等差數列求和嘛
再確切一些,設s[i]表示,有了i種郵票,到n種郵票的步數(不是期望)
所以,f[i]=E(s[i])
所以花費的期望:E(cos)=E((s[0]^2+s[0])/2)
基於期望的線性性質,E(cos)=( E(s[0]^2)+E(s[0]) )/2
我們已經求出了f[0]=E(s[0])
所以,要求出E(s[0]^2) (註意,這個是平方的期望,不等於期望的平方!!)
設g[i]=E(s[i]^2)即從i到n步數平方的期望
因為,E((x+1)^2)=E(x^2)+2*E(x)+1
所以,g[i]=i/n*(E( (s[i]+1)^2 ) + (n-i)/n *(E( (s[i+1]+1)^2 )
拆開它:g[i]=i/n * ( g[i] + 2*f[i] + 1 ) + ( n - i ) * ( g[i+1] + 2* f[i+1] +1)
拆開括號,移項,然後直接求。
總結:
期望一定要小心謹慎分析,不要直覺瞎搞,設計好狀態,轉移。
分清楚 : 事件,概率,結果,期望。
抓住E(x+y)=E(x)+E(y) 還有: E(x)=∑pi*xi
bzoj1426 收集郵票