概率dp 高斯消元 bzoj3270 博物館

2022-05-20 03:32:31 字數 2449 閱讀 2023

一類成環概率dp的操作模式

有一天petya和他的朋友vasya在進行他們眾多旅行中的一次旅行,他們決定去參觀一座城堡博物館。這座博物館有著特別的樣式。它包含由m條走廊連線的n間房間,並且滿足可以從任何一間房間到任何一間別的房間。

兩個人在博物館裡逛了一會兒後兩人決定分頭行動,去看各自感興趣的藝術品。他們約定在下午六點到一間房間會合。然而他們忘記了一件重要的事:他們並沒有選好在哪兒碰面。等時間到六點,他們開始在博物館裡到處亂跑來找到對方(他們沒法給對方打**因為**漫遊費是很貴的)

不過,儘管他們到處亂跑,但他們還沒有看完足夠的藝術品,因此他們每個人採取如下的行動方法:每一分鐘做決定往**走,有pi 的概率在這分鐘內不去其他地方(即呆在房間不動),有1-pi 的概率他會在相鄰的房間中等可能的選擇一間並沿著走廊過去。這裡的i指的是當期所在房間的序號。在古代建造是一件花費非常大的事,因此每條走廊會連線兩個不同的房間,並且任意兩個房間至多被一條走廊連線。

兩個男孩同時行動。由於走廊很暗,兩人不可能在走廊碰面,不過他們可以從走廊的兩個方向通行。(此外,兩個男孩可以同時地穿過同一條走廊卻不會相遇)兩個男孩按照上述方法行動直到他們碰面為止。更進一步地說,當兩個人在某個時刻選擇前往同一間房間,那麼他們就會在那個房間相遇。

兩個男孩現在分別處在a,b兩個房間,求兩人在每間房間相遇的概率。

第一行包含四個整數,n表示房間的個數;m表示走廊的數目;a,b (1 ≤ a, b ≤ n),表示兩個男孩的初始位置。

之後m行每行包含兩個整數,表示走廊所連線的兩個房間。

之後n行每行乙個至多精確到小數點後四位的實數 表示待在每間房間的概率。

題目保證每個房間都可以由其他任何房間通過走廊走到。

輸出一行包含n個由空格分隔的數字,注意最後乙個數字後也有空格,第i個數字代表兩個人在第i間房間碰面的概率(輸出保留6位小數)

注意最後乙個數字後面也有乙個空格

2 1 1 2

1 20.5

0.50.500000 0.500000

對於100%的資料有 n <= 20,n-1 <= m <= n(n-1)/2

記$f[i][j]$為兩人分別在$i$和$j$的概率,$u,v$為分別與$i,j$相連的點,那麼有$$f[i][j]= \begin \sum \frac& \text\\\sum \frac& \text\\\sum \frac& \text\\\sum \frac& \text\end$$

由於這裡dp的關係成環,不能夠直接轉移,所以要使用高斯消元。由此共有$n^2$個狀態,即$n^2$個未知量。故用$id[i][j]$來表示$f[i][j]$,就可方便地把這些未知量的關係用矩陣表示出來。

需要注意的是,初始$f[s][t]$的概率為1,不過後面又會有經過它的概率,所以在計算時需要考慮其初始概率。這裡算是乙個概率dp的奇怪的地方:最終$f[s][t]>1$。

再者是處理的乙個小技巧:添一條自邊便於處理。

1 #include2

const

int maxn = 503;3

4int

n,m,tot,s,t,deg[maxn],id[maxn][maxn];

5double

out[maxn],p[maxn],ans[maxn],mp[maxn][maxn];

6int

g[maxn][maxn];78

void gauss(intn)9

27}28 ans[n] = mp[n][n+1

];29

for (int i=n-1; i; i--)

3034}35

intmain()

3644

for (int i=1; i<=n; i++)

4550

for (int i=1, t=0; i<=n; i++)

51for (int j=1; j<=n; j++)

52 id[i][j] = ++t;

53 mp[id[s][t]][tot+1] = -1;54

for (int i=1; i<=n; i++)

55for (int j=1; j<=n; j++)

5668}69

gauss(tot);

70for (int i=1; i<=n; i++) printf("

%.6lf

",ans[id[i][i]]);

71return0;

72 }

看到有網上有些部落格說,高斯消元這裡$mp[id[i][j]][id[u][v]]$是指$id[i][j]$狀態轉移到$id[u][v]$狀態的概率,這個說法其實是不對的。

$id[i][j]$實際上不過是和常規高斯消元一樣,代表處理第幾條方程;至於$id[u][v]$則表示當前這條方程中的$f[u][v]$;所以$mp[id[i][j]][id[u][v]]$是指第$id[i][j]$條方程中,第$id[u][v]$個未知量的係數。

end

bzoj3143 遊走 概率 高斯消元

題目大意是說 給出一張無向圖,找出一種加權值的方式,使得從1到n期望帶權路徑長度最短,輸出最短路長度。首先,根據基本常識,走的次數多的邊,權值越小越好 廢話 於是問題轉變為 找出每條邊的期望經過次數。設i邊期望經過次數為f i 則f i 就為兩個端點期望經過次數與走到這條邊概率之商的和 沒看懂?就是...

HDU 4870(概率DP,高斯消元)

2015 04 24 23 55 19 題目 乙個人拿兩個號打比賽,初始rating為0,每次她都拿rating低的號來打,漲rating的概率為p,一次漲50,降rating的概率為1 p,一次降100,問讓某個號的rating漲到1000需要的期望比賽場數。思路 2個號只是拿來迷糊人的,把50看...

HDU 2262(高斯消元,概率DP)

2015 04 13 22 49 30 思路 參考了愛神的部落格a的.也改善了下高斯的模板。首先給每個格仔編號,假設某個格仔 設為第 i 個 到終點的期望為ei,考慮第 i 格的所有可行後繼節點 可行節點的意思是這些後繼節點可以到達終點 記為en1,en2.enk,總共k個,可列方程 ei en1 ...