概率dp學習整合

什麼都不會的概率Dp。。。把一些好的資料收集起來慢慢看把。。。orz這些大神,蔑視我這zz垃圾

轉自:http://blog.csdn.net/zy691357966/article/details/46776199

有關概率和期望問題的研究

摘要

在各類信息學競賽中(尤其是ACM競賽中),經常出現一些與概率和期望有關的題目。這類題目需要較高的數學水平和一定的算法技巧,必須經過仔細分析,選擇合適的數學模型和算法才能順利的解決問題。本文就對這類題目的一些常見方法進行了研究。

數學基礎

這裏寫的數學基礎是有關概率和期望的一點簡單的計算法則,雖然我們都很熟悉,但是有時也可能會忘記使用,所以在這裏列出來,也作爲以後內容的基礎。

概率的運算

Ø 兩個互斥事件,發生任一個的概率等於兩個事件的概率和

Ø 對於不相關的事件或者分步進行的事件,可以使用乘法原則。

Ø 對於一般情況p(A+B)=p(A)+p(B)-p(AB)

期望的運算

Ø E(φ)= ΣφiPi,這是期望的定義,其中φi是一個取值,而Pi是取這個值的概率

Ø 期望有“線性”,也就是說對於不相關的兩個隨機變量φ和ξ,E(φ±ξ)=E(φ)±E(ξ);E(φξ)=E(φ)E(ξ);E(φ/ξ)=E(φ)/E(ξ)

Ø 在某些情況下,期望可以表示成一個無窮的等比數列,然後利用極限的思想來求。

當然,這些只是最基礎的知識,要解決好概率和期望的問題,還需要掌握一些組合數學的知識。

常用方法

方法1 直接計算

這種方法說起來很簡單,就是推導出一個數學公式,然後通過程序來計算這個式子的值。這樣的題目在與概率和期望有關的題目中比例不小,但是由於它們大都需要一定的組合數學基礎,而一旦推導出公式,對算法的要求並不太高,而時間複雜度往往也比較低,所以這類問題不是本文的重點。有關內容可以在任何一本組合數學書中學到。

例一 百事世界盃之旅[1]

 “……在2003年6月之前購買的百事任何飲料的瓶蓋上都會有一個百事球星的名字。只要湊齊所有百事球星的名字,就可以參加百事世界盃之旅的抽獎活動,獲取球星揹包、隨身聽,更可以赴日韓觀看世界盃。還不趕快行動!……”

你關上電視,心想:假設有n個不同球星的名字,每個名字出現的概率相同,平均需要買幾瓶飲料才能湊齊所有的名字呢?

輸入輸出要求

輸入一個數字n,2≤n≤33,表示不同球星名字的個數。                                                            

輸出湊齊所有的名字平均需要購買的飲料瓶數。如果是一個整數則直接輸出。否則就用下面樣例中的格式分別輸出整數部分和小數部分。分數必須是不可約的。

樣例輸入和輸出

輸入

輸出

2

3

5

          5

11———

         12

17

       340463

58 —————–

        720720



[1] 題目來源 SHTSC2002 Day 1 Prob 2

分析 這是一道比較簡單的概率和期望問題。只要確定好計算方法,就可以很容易的得到公式。如果單獨考慮每一名球星,那麼就中了命題人的圈套。因爲考慮單獨的一個球星的時候所買的“沒用”的飲料在考慮其他球星的時候可能會變成有用的。正確的思路是,假設現在已經有k個球星的名字,那麼要使球星的名字達到k+1個平均需要買多少瓶飲料?這是很容易計算的,是n/n-k。所以我們從沒有球星的名字開始,直到把所有的球星名字都湊齊,平均需要的飲料數(E)就可以計算出來:

ANS=n(1/1+1/2+1/3+….1/n)

由於題目的數據規模並不大,所以可以直接使用PASCAL的Comp或Int64(C/C++的long long)進行計算。而題目要求得到即約分數,只要在計算的時候使用分數並注意約分就可以了。

我的分析:

當有k個人的時候,抽到下一個的概率是n-k/n  所以平均需要n/n-k瓶才能買到下一個

所以ANS=n(1/1+1/2+1/3+….1/n)

這裏可以用分數直接計算

如果n很多 需要關於n的近似公式  0.57721566490153286060651209 + ln(n)


方法2 動態規劃

動態規劃是一種應用範圍很廣的方法,由於概率和期望具有前面提到過的一些性質(特別是期望的定義以及期望的“線性”性質),使我們可以在概率和期望之間建立一定的遞推關係,這樣就可以通過動態規劃來解決一些概率問題。

與其他方面的動態規劃一樣,合理的選擇狀態以及高效的狀態轉移方程是應用這種方法的關鍵,而狀態的選擇在這類問題中尤爲重要。選擇合適的狀態不僅可以提高效率,而且可以保證動態規劃所必須的無後效性。而動態規劃的各種優化方法也可以應用。

概率和期望的最值問題也往往使用動態規劃的方法來解決。

例二 多米諾骨牌[1]

你試圖把一些多米諾骨牌排成直線,然後推倒它們。但是如果你在放骨牌的時候不小心把剛放的骨牌碰倒了,它就會把相臨的一串骨牌全都碰倒,而你的工作也被部分的破壞了。

比如你已經把骨牌擺成了DD__DxDDD_D的形狀,而想要在x這個位置再放一塊骨牌。它可能會把左邊的一塊骨牌或右邊的三塊骨牌碰倒,而你將不得不重新擺放這些骨牌。

這種失誤是無法避免的,但是你可以應用一種特殊的放骨牌方法來使骨牌更多的向一個方向

分析

首先應該明確怎樣找到最佳的擺放策略。我們可以考慮在位置i放最後一塊骨牌。顯然,i前面的i-1塊骨牌和i後面的n-i塊骨牌是互不影響的。所以我們假設擺放i-1塊骨牌需要的次數平均是(或說期望是)E1,擺放n-i塊骨牌需要的次數平均是E2。那麼我們擺放了這兩段之後,就要把最後一塊放上。這時如果把左邊的碰倒了,就只好重新擺放。右邊的也是同樣的道理。所以需要擺放的平均值(E)是:

E = E+ E +

這個式子的推導並不困難,方法之一就是應用方程的思想(參見後面介紹的概率—期望系統)。

既然得到了這個式子,我們就可以通過動態規劃來得到最優的擺放方案。設Ei是擺放i塊骨牌所需要的最少期望次數,那麼狀態轉移方程是:

Ei ­= min{E+ Ei-1-k­ + } (0≤k≤i-1)

這樣就得到了一個O(n2)的算法。根據題目中的數據規模,最大的運算量是100*1000= 108,雖然可以忍受,但是還是比較慢的,如果數據稍大一點就容易超時。

這就需要我們對動態規劃進行優化。

這是一個1D/1D的動態規劃,我們自然希望得到O(n)的算法,而這種優化一般都是通過動態規劃的方程性質得到的。

觀察動態規劃的方程,我們可以發現,當k從0變化到i-1時第一項是不斷增大的,第二項是不斷減小的,第三項則是一個常數。因此整個函數一定是單峯的,這樣就可以通過二分的方法進行優化,複雜度已經降到了O(nlogn)。而事實上,E這個數列不但是單增的,而且是凹的(如果PlPr=0就不凹也不凸,但是這不影響這裏的討論),通過這個性質我們還可以證明決策使用的k一定是不減的(證明很簡單,略去)。這樣通過記錄上一次決策使用的k,就得到了一個(均攤的)O(n)的算法。



[1] 題目來源 UVA 10529

方法3 迭代

動態規劃要求問題無後效性,而如果問題有不可避免的後效性,動態規劃就無能爲力了。這時我們可以採用迭代的方法來進行計算。

當然,迭代也不是萬能的,它要求問題有收斂性而且收斂的速度要足夠快,而且要求的結果精度不要太高。對於同一規模的不同的輸入,迭代法的效率可能會有很大的改變,所以這種方法有可能因爲遇到比較壞的數據而失效。

此外,迭代法也未必是要解決有後效性的問題,只要問題有收斂性,迭代都可以起到一定的作用,下面這道例題就沒有後效性,但是由於動態規劃的時間複雜度過高,所以採用了一種動態規劃和迭代混合的方法來解決。

例三 巧克力[1]

2100年,ACM牌巧克力將風靡全球。

“綠的,橘紅的,棕色的,紅的…”,彩色的糖衣可能是ACM巧克力最吸引人的地方。你一共見過多少種顏色?現在,據說ACM公司從一個24種顏色的調色板中選擇顏色來裝飾他們的美味巧克力。

有一天,Sandy用一大包有五種顏色的巧克力玩了一個遊戲。每次他從包裏拿出一粒巧克力並把它放在桌上。如果有桌上有兩粒相同顏色的巧克力,他就把他們喫掉。他驚奇的發現大多數時候桌上都有2到3粒巧克力。

如果ACM巧克力有C(1≤C≤100)種顏色,在拿出了N(1≤N≤1000000)粒巧克力之後在桌上恰有M(1≤M≤1000000)粒的概率是多少?

分析

如果N不是那麼大的話,我們是很容易用動態規劃來解決此題,狀態轉移方程就是

Pi+1,k=Pi,k-1*(C-k-1)/C+Pi,k+1*(k+1)/C

其中Pi,k表示拿出了i粒巧克力後桌上剩餘M粒的概率(當然還要考慮一些邊界情況)。但是現在N可以達到1000000,如果直接動態規劃肯定是要超時的。

這個題的標準算法是使用生成函數。也就是說把“桌上有m塊巧克力”轉化成“有m種巧克力取了奇數塊,其餘的都取偶數塊的取法”。所以就可以列出生成函數是,所以總的取法數就是xn的係數乘以n!和C(c,m),而概率就是總的取法數除以cn,然後通過進一步的代數分析來化簡解決。這種方法當然是很優秀的,複雜度是O(c2)。但是由於這道題的精度要求很低,迭代的方法也是可以達到目的的,而且複雜度也接近O(c2)。

這道題裏不會出現極大或極小的概率,一般來說這種情況下的收斂是比較快的。我們可以不斷的計算P的值,當它的變化不足以影響結果時就停止計算。當然這道題裏的收斂是分奇偶的(顯然桌上剩餘的巧克力數和拿出的巧克力數是同奇偶的),所以不能比較Pi和Pi-1,而要比較Pi和Pi-2,只要看到Pi和Pi-2差距小於一個定值(比如1e-5),而且i和N同奇偶,就可以停止動態規劃,因爲此時繼續規劃下去所產生的不同已經不可能影響到要輸出的結果。經過實驗發現,最大的數據也只在幾百次迭代中就穩定了,這樣就將效率大大提高,滿足了題目的要求。



[1] 題目來源ZJU OnlineJudge 1363

方法4 概率—期望系統 

這個是我自創的,或許是由於不是很難吧,這個東西我在資料中沒有見到過。其實這就是方程的思想在概率和期望問題中的一個應用。

概率—期望系統的定義

概率—期望系統是一個帶權的有向圖。這個圖中的點代表一個事件,而如果點A與點B之間有一條權爲p的邊,就表示A發生後,B緊接着發生的概率是p。初始的時候,有一個點(叫做初始點)代表的事件發生了,其他事件根據概率依次發生,每次只發生一個。求其他各個事件發生次數的期望。記時間A的發生次數期望爲EA,A到B的邊權爲PAB

一些限制

Ø 對任意的AB,PAB≤1

Ø 對於任意點A,,且對於系統中的所有點,至少有一個點使等號不成立。如果等號都成立的話這些事件將無窮無盡的發生下去,而概率—期望系統則變得沒有意義(此時期望或者是無窮大,或者是0)。

Ø 不能有指向初始點的邊,這是因爲求解時我們把初始頂點的概率設爲1。但是如果真的有這樣的邊,可以添加一個假點作爲初始點,這個假點到真正的初始點有一條概率爲1的邊。

概率—期望系統的求解

我們首先來看一種最簡單的概率—期望系統:有向無環圖的概率—期望系統。這種系統是很簡單的,因爲它沒有後效性,所以可以通過動態規劃的方法在O(E)的時間內解決。許多使用動態規劃解決的概率—期望問題都是基於這類系統的。比如ZJU1022 Parallel Expectation就是這樣的。

但是在有些問題中(比如下面的例4),我們需要解決更一般的概率—期望系統。這時圖中含有圈,因而造成了後效性。我們當然可以用迭代法,而如果設第i次迭代時A的期望用Ei,A來表示,迭代的方程就是

通過若干次的迭代,就可以達到我們需要的精度。但是這個方法的效率是不穩定的,考慮這樣一個例子:A是起始點,PAB=1,PBC=1,PCB=0.99,這個例子的解是EA=1,EB=100, EC=100,但是如果用迭代的話需要很多次才能達到這個結果。而如果PCB=0.9999,那麼迭代法的速度就更加緩慢。

如何避免這種情況的出現呢?我們當然不能限制數據,而應該尋找更穩定的方法。考慮剛纔迭代的過程,我們發現,在迭代的終點,近似的有

,這是一個方程,而這個方程的解其實就是我們所要求的解。我們只要把這個方程解出來,就可以得到精確的結果,而剛纔說的迭代過程,實際上就是這個方程的求解過程(線性方程組的一種解法——Jacobi法就是這樣做的)。而求線性方程組的解,我們更常用的穩定算法是高斯消元法,完全可以在這裏使用。這樣就得到了一種穩定而精確的解法:

首先根據概率—期望系統建立方程組,然後用高斯消元法去解,得到的結果就是我們要求的期望。這種算法的時間複雜度是O(n3)。

當然這個複雜度是不很理想的,但是對於解方程組,我們沒有更簡單而高效的方法,所以這個算法還是比較可取的。而迭代法也不能忽視,在概率不會出現極大或極小,而且邊又不多的時候,迭代法的效率往往會高於高斯消元。

此外,即使概率—期望系統中有環,也並不一定就不能使用動態規劃來解決,當環之間滿足一個偏序的時候,我們仍然可以使用等比數列求和的方法來進行處理,從而達到更好的複雜度。

例四 簡單遊戲[1]

所謂簡單遊戲,相信大家小時候都玩過,就是那種擲出股子子,然後按擲的步數走的遊戲。現在有一個n(1≤n≤100)個格子的遊戲,一些格子上有指令。指令分成若干種,如下:

Ø 0——空指令

Ø -1——陷阱,到了這裏後要擲出六才能繼續向前,注意不是向前六步,而是要再擲一次決定步數。

Ø -2——停一次

Ø 其它數字——轉移指令,走到數字所代表的格子

走到陷阱中是很難出來的,因此大家都不希望走到陷阱裏。玩一次遊戲走到陷阱裏的平均次數到底是多少呢?這個問題將由你來解決。

輸入:第一行n,表示遊戲的格數。第二行有n個數,表示每個格子的指令(第一個和最後一個都沒有指令)。注意如果某次走到的位置達到或超過最後一個格子,都表示遊戲結束。

輸出:走到陷阱裏的平均次數。保留3位小數,請儘量使用extended類型。

樣例:

輸入


輸出


4
0 -1 2 0


0.400



解釋:第一次走到陷阱裏,概率爲1/3,第二次走到陷阱裏,概率爲(1/3)(1/6),第三次(1/3)(1/6)2,……
由等比數列的求和公式中令n=無窮,可得概率之和爲(1/3)/(1-(1/6))=2/5=0.4

分析

如果按照題目中的那個“解釋”的思路走,就不免中了圈套。題目中的轉向指令可以造成非常複雜的圈套圈的情況,用求極限的思想很難解決。

有了概率—期望系統,這個問題就並不困難了。我們只要構造一個圖就可以。把到達每個格子作爲一個事件,每個事件如果沒有轉向指令就向後面的六個格子各連出一條概率爲1/6的邊,如果有轉向指令就向轉向的那個格連一條概率爲1的邊。的由於題目中沒有限制第一個格子不會有轉移指令指向,所以我們不能簡單的把第一個格子作爲起始點,而應該做一個假起點,叫做0點,然後讓0到1有一條概率爲1的邊就可以。例如樣例中的遊戲對應的圖和方程就是:

 

 

 

 

 

 



其中三角形箭頭表示概率是1,普通箭頭表示概率是1/6。



方程組:

E1 = 1

E2 = E+ E3

E3 = E+ E2

解得E2 = 0.4,這就是我們需要的結果。



對於任何一個遊戲,我們都可以按這種方法建立一個概率—期望系統,剩下的問題就是應用高斯消元法來解決就可以了。

當然我們不能忘記迭代法。但是容易看出,迭代法在這道題中可能遇到特殊設計的數據(一個典型的數據就是5個轉向指令連成一排,這種結構只要重複幾次就會造成答案非常大,可以達到105以上),對於這種數據,迭代是無法出解的。因此,本題選擇高斯消元是比較好的方法。

總結

本文對有關概率和期望的問題進行了一些研究,介紹了直接計算,動態規劃,迭代以及概率—期望系統四種常用方法。在實際解題時,只有具備紮實的數學基礎,靈活運用這些方法,才能順利的解決各種各樣的概率問題。




轉自:http://blog.csdn.net/auto_ac/article/details/9907881

很早就被概率題和期望題虐得不行了,這次真的不能忍了,怒刷概率dp,學到了很多,都是最基礎的,還需日後強化。

下面說一下我個人的總結: 


   很多概率題總逃不開用dp轉移。
           
        期望題總是倒着推過來的,概率是正着推的,多做題就會理解其中的原因
            
            有些期望題要用到有關 概率 或 期望的常見公式或思想
       
                  遇到dp轉移方程(組)中有環的,多半逃不出高斯消元(手動 和 寫代碼 兩種)
  
                          這套題中還有道樹上的dp轉移,還用dfs對方程迭代解方程, 真是大開眼界了
                
                                    當然還有與各種算法結合的題,關鍵還是要學會分析

                                               當公式或計算時有除法時, 特別要注意分母是否爲零


以下的題都是很常見的簡單題或中等題,簡單題儘量自行思考,最好不要看題解



1、POJ 3744 Scout YYF I (簡單題)

很裸的狀態轉移,並用矩陣乘法分段優化, 以前也出現過不少這樣的題了。



 2、POJ 3071 Football      (簡單題)

足球賽的淘汰賽問題。問最後勝利的概率最大的球隊。每個隊的勝率都用dp算一下比較



3、codeforces 148D Bag of mice   (簡單題)

抓老鼠問題。記憶化搜索的話不是很難,要寫成for循環的那就比較麻煩了

        


算很常見的一種dp表示吧。 學會 “至少” 這類問題角度的轉化。




有m個位置,每個位置填入1~n中的一個數,求至少有L個數一樣的概率。 dp轉移還行,就是要用Java的     高精度
                 


6、SGU  495 Kids and Prizes     (YY題)

 YY題,O(1)推出結論,想不到就覺得比較難, 分析問題的角度值得學習。



7、POJ 2096 Collecting Bugs   (簡單題)

dp求期望入門題。關鍵要體會爲什麼要倒着推過來 



 8、HDU 3853 LOOPS      (簡單題)

 同第6題, 但要注意一個小問題



9、HDU  4405 Aeroplane chess   (簡單題)

這題是2012年網絡賽的題目。同第6題,只是題目多加了一個小小的條件



10、ZOJ 3640  Help Me Escape    (簡單題)

做完6,7,8題後仔細想想,還是差不多的題, 記憶化搜索也容易想到



11、HDU 4336 Card Collector  (簡單題)

 狀態壓縮概率DP。或者用容斥原理直接求。

           
         
12、ZOJ 3329  One Person Game   (中等題-)

骰子求期望的題, 遞推公式有點麻煩。



13hdu 4652 Dice     (中等題-)

dp求期望 推數學公式, 最近第5場多校題, 賽後發現其實是道很基礎的題,可惜沒學過, 用高中知識就能推出來了

 


14、HDU 4035 Maze     (中等題+)

樹上的dp遞推, 寫出遞推關係方程組後,用dfs從樹的葉子節點一路往上迭代方程求解



15、HDU 4089 Activation    (中等題)

2011年北京現場賽的題目, 用求期望的方法 求概率的題,公式有一點點繁瑣,仔細想也是可以做出來的
                   


16、HDU 4418 Time travel  (中等題)

高斯消元,這題是學長出的,目的是坑人題意的, 題意理解以後就是很裸的高斯消元(用程序解方程),但還是有很多坑

轉自:http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html

1、POJ 3744 

Scout YYF I
此題是一個用矩陣優化的求概率的題目。
主要思想是分段,根據轉移方程用矩陣求解。
題解見 here

 2、POJ 2096 Collecting Bugs

dp求期望,概率dp入門題。很簡單,題解見here


 3、ZOJ 3329  One Person Game

此題的遞推方程稍微複雜點,需要轉化後求解係數。

題意:有三個骰子,分別有k1,k2,k3個面。
每次擲骰子,如果三個面分別爲a,b,c則分數置0,否則加上三個骰子的分數之和。
當分數大於n時結束。求遊戲的期望步數。初始分數爲0

題解見here


4、HDU  4405 Aeroplane chess

這題是2012年網絡賽的題目。是很簡單的概率dp.轉移方程很好想到。

求期望。按照公式從後望前遞推就可以得到答案了。

解題報告here


 5、HDU 4089 Activation

這題是求概率,但是也有種求期望的感覺,都是要列出公式來,化簡,遞推出答案。

2011年北京現場賽的題目。再比賽時做出來確實不容易,需要對概率DP很熟悉才能做出來。

解題報告見here


6、HDU 4035 Maze

經典的的概率DP的題目。做了可以體會到dp 求期望的一類的方法。

解題報告見here


 7、HDU 3853 LOOPS

 比較簡單的概率DP了,入門基礎題。

注意一個小陷進。

解題報告here


8、POJ 2151 Check the difficulty of problems

此題還不算是概率DP的題目。就是DP題,求概率。

想到轉移方程就不難了。

題解見here


 9、Codeforces  148D Bag of mice

抓老鼠問題。轉移方程要思考下就出來了。

解題報告here


10、POJ 3071 Football

足球賽的淘汰賽問題。問最後勝利的概率最大的球隊。

簡單概率DP

題解報告見here


 11、SGU  495 Kids and Prizes 

簡單的概率DP。  O(1),推公式就可以出來。

解題報告here


 12、ZOJ  3380 Patchouli’s Spell Cards

Java的大樹做的概率DP。有m個位置,每個位置填入1~n中的一個數,求至少有L個數一樣的概率。

解題報告見here


 13、ZOJ 3640  Help Me Escape

比較簡單的概率DP,記憶化搜索很好理解,也很容易寫。

解題報告here


 14、HDU 4336 Card Collector

求期望,可以狀態壓縮概率DP求解。也可以用容斥原理直接求。解題報告here

 

下面介紹的三題是用高斯消元法求解的概率DP

15、ZJUT 1423 地下迷宮

 一個N*M的迷宮,除了障礙外等概率走,求起點走到終點步數的期望。先在起點進行bfs,找出所以可以到達的點並編號,然後建立方程組求解。


16、ZJUT 1317 擲飛盤

在一個環上拋擲兩個飛盤 ,每個飛盤等概率往左和右走,問兩個飛盤走到同一個地方所需要步數的期望。

按照他們的距離表示狀態進行概率DP。dp[i]=dp[i-2]/4+dp[i+2]/4+dp[i]/2+1.整理下就出來方程。注意是循環的,要進行處理。

 

17、HDU 4418 Time travel

在座標軸上用高斯消元法求解。注意N=1的時候要特判一下。解題報告here




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章