1. 程式人生 > >數論----概率,期望

數論----概率,期望

近年的acm競賽中,數學期望問題常有涉及,在以前也常讓本人感到很頭疼,近來突然開竅,掌握了基本的分析方法,希望對大家有幫助。寫得淺薄,可能數學上不夠嚴謹,只供理解。

首先,來看下期望有啥基本的公式。

對離散型隨機變數x,其概率為p,有

對隨機變數AB, 

第二條式子是今天的主角,他表明了期望有線性的性質,簡單理解就是期望之間可根據關係,簡單運算(不嚴謹的理解)。這就為我們解決一個期望問題,不斷轉化為解決另外的期望問題,最終轉化到一個已知的期望上。

舉一個求期望最簡單的例子,見下圖。

假設有個人在 1號節點處,每一分鐘他會緣著邊隨機走到一個節點或者在原地停留,問他走到4號節點需要平均幾分鐘?


 

這是個簡單的期望問題,我們用Ei(i=1,2,3,4) 表示從i號節點走到4號節點的數學期望值。根據題意對1號節點有

E1=1/3*E1+1/3*E2+1/3*E3+1 

表示下一分鐘可以走到2或者3或在原地1,每個可能概率是1/3 ,注意是下一分鐘,故要加上1.

同理我們對節點23同樣可以列出

E2=(1/3)*E1+(1/3)*E2+(1/3)*E4+1 

E3=(1/3)*E1+(1/3)*E3+(1/3)*E4+1 

E4等於多少呢? 很明顯E4=0 ④,因為他就是要到點4

這樣上面1234式其實就是組成了一組方程組,解方程組就可得出E1!!,用高斯消元,複雜度是O(n^3)

從上述例子,我們可總結出如何解決期望類問題,根據題意,表示出各個狀態的期望(上例的Ei1234,根據概率公式,列出期望之間的方程,解方程即可。

下面看用上述思路如何解決一道題(poj2096

原題見附件1

題意簡述: 一個人受僱於某公司要找出某個軟體的bugssubcomponents,這個軟體一共有nbugsssubcomponents,每次他都能同時隨機發現1bug1subcomponent,問他找到所有的bugssubcomponents的期望次數。

我們用E(i,j)表示他找到了ibugsjsubcomponents,離找到nbugsssubcomponents

還需要的期望次數,這樣要求的就是E(0,0),E(n,s)=0,對任意的E(i,j),1次查詢4種情況,沒發現任何新的bugssubcomponents,發現一個新的bug,發現一個新的subcomponent,同時發現一個新的bugsubcomponent,用概率公式可得:

E(i,j)=1+(i*j/n/s)*E(i,j)+(i*(s-j)/n/s)E(i,j+1)+

((n-i)*j/n/s)*E(i+1,j)+(n-i)*(s-j)/n/s*E(i+1,j+1);

這樣根據邊界就可解出所有的E(i,j),注意因為當我們找到nbugsssubcomponents就結束,對i>n||j>s均無解的情況,並非期望是0.(數學上常見問題,0和不存在的區別)

那這題是否也是要用高斯消元呢? 用高斯消元得話複雜度是O(n^3),達到10^18 根本是不可解的!!

但其實,注意觀察方程,當我們要解E(i,j)的話就需要E(i+1,j),E(I,j+1),E(i+1,j+1), 一開始已知E(n,s),那其實只要我們從高往低一個個解出I,j就可以了! 即可根據遞推式解出所有的E(I,j) 複雜度是O(n),10^6 ,完美解決。程式見附件2

從上面這道題,我們再次看到了解決期望問題的思路,而且是用到了遞推解決問題,其實可遞推的原因,當我們把各個狀態當成是一個個節點時,概率關係為有向邊,我們可看到,可遞推的問題其實就是這個關係圖是無環的!!那必須要用方程組解決的問題其實就是存在環!!!! 而且我還要指出的是用高斯消元的時候,要注意誤差的問題,最好把式子適當的增大,避免解小數,否則誤差太大,估計也會卡題。

-----------------------------------------------------------------

//2015.5.11更新

當求出轉移方程的時候,如何破環是關鍵.

當每個方程之和一個未知數關聯時,迭代兩次即可eg:hdu 4089

當有一個是多個時,就必須用高斯消元

===================================================

前段時間一直在做概率的題目。

1、A=a+b+c  abc是三種情況,那麼P(A)=a*P(a->事件)+b*P(b->事件)+c*P(c->事件);
a->事件意思是 在a情況下的事件,就是全概率公式的思想吧
2、一定注意每一步會不會出現分母為0 的情況,以及預處理的時候對於一些特殊情況導致自己的式子會出現分母為0的排除掉

一、期望

其中求解期望問題剛開始一直不理解。後來做得多了有感覺。

例:(有放回)

在5件產品有4件正品,1件次品,從中任取2件,記其中含正品的個數個數為隨機變數ξ,則ξ的數學期望Eξ是 1.6

在5件產品有4件正品,1件次品,從中任取2件,記其中含正品的個數個數為隨機變數ξ,則ξ=2時所取次數的數學期望是1.16

第一個例子是平常學的期望,做一件事情各個結果的可能情況期望。第二個例子是題目出的,做一件事情需要次數的期望。

解決這類問題,對隨機變數A、B,有 數學期望E(aA+bB)=aE(A)+bE(b);
有了這個公式你就可以進行將連續的期望問題,轉化為獨立的狀態了,概率就相當於a,b;A,B為變數。變為線性問題。

E1=(1/3)*E1+(1/3)*E2+(1/3)*E3+1 ①
表示 下一次可以走到2或者3或在原地1,每個可能概率是1/3 ,注意是下一次,故要加上1.

對於這類問題有三種,

zoj 3640 當終結點不容易確定的時候用記憶化搜尋。

2 只是個別點會構成迴路 hdu4035  zoj3329

既DP[i]可能由DP[i+k]和DP[i+j]需要求的比如DP[0]決定
相當於概率一直遞推下去會回到原點 
比如
(1):DP[i]=a*DP[i+k]+b*DP[0]+d*DP[i+j]+c; 
但是DP[i+k]和DP[0]都是未知
這時候根據DP[i]的方程式假設一個方程式:
比如:
(2):DP[i]=A[i]*DP[i+k]+B[i]*DP[0]+C[i];
因為要求DP[0],所以當i=0的時候但是A[0],B[0],C[0]未知
對比(1)和(2)的差別 
這時候對比(1)和(2)發現兩者之間的差別在於DP[i+j]
所以根據(2)求DP[i+j]然後代入(1)消除然後對比(2)就可以得到A[i],B[i],C[i]
然後視具體情況根據A[i],B[i],C[i]求得A[0],B[0],C[0]繼而求DP[0] 

3 (用來破環)高斯消元解決,迷宮概率.......HDU2262

對於來回對稱方向的處理類似環形dp處理,可以對稱加過去 eg: 6   可以表示成 1 2 3 4 5 6 5 4 3 2 然後取模返回去。

 HDU4418

//E[x] = sum ((E[x+i]+i) * p[i])  
// ----> E[x] - sum(p[i]*E[x+i]) = sum(i*p[i])  

這個沒什麼說的

4 狀態壓縮 HDU4336 這個和無環遞推一樣,不過也可以用容斥的方法。

首先容斥定理相當於是求多個集合的並集,但是因為兩兩之間有交集所以需要剪掉重複剪掉的部分。當集合個數多於三個的時候又會出現三個集合之間的交集被誤剪掉了,或者四個之間的交集部分又重複計算了等等。於是容斥定理就有用了,當集合個數為n時,我們要算總並集,我們就要算所有的一個集合的大小,所有的兩個集合的交集的大小,所有的三個的集合交集的大小,直到n個集合的交集的大小,中間偶數個減掉,奇數個加起來就可以了。樓主容斥定理的那個程式用i的二進位制表示一個大集合,i中的每個1表示一個小集合。當i++從0到(1<<n-1)就是00...000到11...111變化的過程可以窮舉所有的可能交集情況,然後算出它的大小。“cnt&1”就是在判斷奇偶,通過加或者減算出並集。
“1.0/sum”是在算包數,就是期望=np,所以n=期望除以概率,這裡期望只要是1就可以了。然後就是每種情況求概率的問題了,比如說某種情況是1101,那麼就是算1000,0100,0001三種事件同時發生的概率,因為各個事件是獨立的,所以直接可以把概率相加得到總的概率。

獨立事件概率相加理解:一次取到這幾個東西都行的概率。而之前單個概率值是取單個的概率

其中 f[i]+=in[j]*f[i|(1<<j)];可以保證無後向性。

二、概率

驗前概率就是通常說的概率,驗後概率是一種條件概率,但條件概率不一定是驗後概率。貝葉斯公式是由驗前概率求驗後概率的公式。
舉一個簡單的例子:一口袋裡有3只紅球、2只白球,採用不放回方式摸取,求:
⑴ 第一次摸到紅球(記作A)的概率;
⑵ 第二次摸到紅球(記作B)的概率;
⑶ 已知第二次摸到了紅球,求第一次摸到的是紅球的概率。
解:⑴ P(A)=3/5,這就是驗前概率;
⑵ P(B)=P(A)P(B|A)+P(A逆)P(B|A逆)=3/5
⑶ P(A|B)=P(A)P(B|A)/P(B)=1/2,這就是驗後概率。

poj3744  一條路上有地雷,一個人要通過那必然是都得通過(沒有踩到),遞推就能解決。使用要矩陣快速冪。注意移位使用本來的數字否則會溢位。

poj3071 足球概率模擬題,注意二進位制倍增的過程中三層迴圈。

CodeForces 148D   dp意思是龍在X X情況下勝利的概率,依據題意可以很容易寫出。

poj2151     每隊均至少做一題的概率P1 減去 每隊做題數均在1到N-1之間的概率P2

SGU 495
題意:n個盒子裡裝有禮物,m個人隨機選擇禮物,選完之後空盒子放回
問選中的禮物數的期望。

m個人是獨立的。
對於每個禮物不被人選中的概率為((n-1)/n)^m
那麼不被選中的禮物數的期望就是 n*((n-1)/n)^m
所以答案就是  n-n*((n-1)/n)^m;
或者
//第i個人得到禮物的概率:假如第i-1個人沒有得到禮物,那麼i得到禮物的概率和i-1一樣。
//假如第i-1個人得到了禮物,那麼i得到禮物的概率是i-1得到禮物概率減去1/n
            dp[i]=(1-dp[i-1])*dp[i-1]+dp[i-1]*(dp[i-1]-1.0/n);

HDU 4089 dp[i][j]表示佇列中有i個人,Tomato排在第j個,能發生所求事件的概率。

轉移的時候,考慮的是隊頭的那個人而不是當前在J這個位置。

j == 1 :     dp[i][1] = p1*dp[i][1] + p2*dp[i][i]   + p4;
2<=j<=k: dp[i][j] = p1*dp[i][j] + p2*dp[i][j-1] + p3*dp[i-1][j-1] + p4;
j > k  :      dp[i][j] = p1*dp[i][j] + p2*dp[i][j-1] + p3*dp[i-1][j-1];

ZOJ 3380

可以dp處理有沒有i個位置的數字一樣的概率dp[i][j]表示當前已經放了j個位置,用到了第i種顏色
即dp[i][j]=dp[i-1][j-k]*C(m-(j-k),k)    (k<=j&&k<l) 表示我們找出k個位置填入數字i
因為如果l>m則必然是無解的,l>m/2可以直接用組合計數算出,時間減少一半數字很大,也沒有取模,需要大數處理

推薦幾篇參考的論文: