1. 程式人生 > >bzoj1426 收集郵票

bzoj1426 收集郵票

等差數列 一次 怎麽 zoj 情況 還要 數組 不同的 講解

題目描述:

有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 收集郵票