近年的acm競賽中,數學期望問題常有涉及,在以前也常讓本人感到很頭疼,近來突然開竅,掌握了基本的分析方法,希望對大家有幫助。寫得淺薄,可能數學上不夠嚴謹,只供理解。
首先,來看下期望有啥基本的公式。
對離散型隨機變數x,其概率為p,有 e(
x)=∑
ipix
i 對隨機變數a、b有 e(
αa±β
b)=α
e(a)
±βe(
b)第二條式子是今天的主角,他表明了期望有線性的性質,簡單理解就是期望之間可根據關係,簡單運算(不嚴謹的理解)。這就為我們解決乙個期望問題,不斷轉化為解決另外的期望問題,最終轉化到乙個已知的期望上。
舉乙個求期望最簡單的例子,見下圖。
假設有個人在 1號節點處,每一分鐘他會緣著邊隨機走到乙個節點或者在原地停留,問他走到4號節點需要平均幾分鐘?
這是個簡單的期望問題,我們用 ei
(i=1
,2,3
,4) 表示從i號節點走到4號節點的數學期望值。根據題意對1號節點有 e1
=(1/
3)∗e
1+(1
/3)∗
e2+(
1/3)
∗e3+
1 ①
表示他下一分鐘可以走到2或者3或在原地1,每個可能概率是1/3 ,注意是下一分鐘,故要加上1.
同理我們對節點2,3同樣可以列出e2
=(1/
3)∗e
1+(1
/3)∗
e2+(
1/3)
∗e4+
1 ② e3
=(1/
3)∗e
1+(1
/3)∗
e3+(
1/3)
∗e4+
1 ③ 那e
4 等於多少呢? 很明顯e4
=0④,因為他就是要到點4
這樣上面1234式其實就是組成了一組方程組,解方程組就可得出e1
,用高斯消元,複雜度是o(
n3)
從上述例子,我們可總結出如何解決期望類問題,根據題意,表示出各個狀態的期望(上例的ei
(i=1
,2,3
,4) ),根據概率公式,列出期望之間的方程,解方程即可。
下面看用上述思路如何解決一道題(poj2096)
題意:乙個人受僱於某公司要找出某個軟體的bug和子元件,這個軟體一共有
n 個bug和
s個子元件,每次他都能同時隨機發現
1 個bug和
1個子元件,問他找到所有的bug和子元件的期望次數。
我們用e(i
,j) 表示他找到了
i 個bug和
j個子元件,離找到
n 個bug和
s個子元件還需要的期望次數,這樣要求的就是e(
0,0)
,而e(
n,s)
=0,對任意的e(
i,j)
。 1次查詢4種情況:
1. 沒發現任何新的bug和子元件
2. 發現乙個新的bug
3. 發現乙個新的子元件
4. 同時發現乙個新的bug和子元件
用概率公式可得: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)
移項可得:(1
−(i∗
j)/(
n∗s)
)e(i
,j)=
1+(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)
,注意因為當我們找到n個bug和s個子元件就結束,對
i>n或
j>
s 均無解的情況,並非期望是0 (數學上常見問題,0和不存在的區別)
那這題是否也是要用高斯消元呢? 用高斯消元得話複雜度是o(
n3) ,達到
1018
根本是不可解的!
但其實,注意觀察方程,當我們要解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(
n2) ,完美解決。 my
code
#include
#include
#include
using
namespace
std;
const
int n = 2005;
double dp[n][n];
int main()
}printf("%.4f\n", dp[0][0]);
}return
0;}
從上面這道題,我們再次看到了解決期望問題的思路,而且是用到了遞推解決問題,其實可遞推的原因,當我們把各個狀態當成是乙個個節點時,概率關係為有向邊,我們可看到,可遞推的問題其實就是這個關係圖是無環的!那必須要用方程組解決的問題其實就是存在環! 而且我還要指出的是用高斯消元的時候,要注意誤差的問題,最好把式子適當的增大,避免解小數,否則誤差太大,估計也會卡題。 簡述期望問題的解法
近年的acm 競賽中,數學期望問題常有涉及,在以前也常讓本人感到很頭疼,近來突然開竅,掌握了基本的分析方法,希望對大家有幫助。寫得淺薄,可能數學上不夠嚴謹,只供理解。首先,來看下期望有啥基本的公式。對離散型隨機變數 x,其概率為 p,有對隨機變數a b,有第二條式子是今天的主角,他表明了期望有線性的...
簡說JS中的instanceof
instanceof操作符在mdn上的解釋為 定義instanceof運算子用於測試建構函式的prototype屬性是否出現在物件的原型鏈的任何位置。1 作用 判斷乙個引用是否屬於某建構函式或在繼承關係中判斷乙個例項是否屬於他的父型別。2 判斷邏輯 從當前引用的proto一層一層順著原型鏈往上找,看...
簡說電腦程式是如何執行的
程式源 都是以人類語言寫成的。需要將人類語言翻譯為計算機語言。計算機能聽懂的語言,就叫做機器語言,簡稱機器碼。計算機處理器提供了一套它能夠支援的運算操作的集合,稱為 指令集 指令集限定了該處理器能夠進行的所有運算。而且這些運算通常都是關於數字的運算。所以,如果想解決乙個問題,那麼首先要把這個問題轉換...