DP 概率 紅藍球

2021-09-26 23:57:30 字數 2007 閱讀 1916

有 n 個紅球和 m 個藍球,a,b,c 三個人,輪流取球。若 a 取到紅球則 a 勝利,若 b 取到紅球則 b 勝利,c只負責取球搗亂,不參與勝負。若最後全部球取完後 a 沒有拿到紅球,則 b 勝利,求 a 勝利的概率。

輸入:m, n

輸出:a 勝利的概率,保留 5 位小數(補零)

樣例輸入: 3 4 (3 個紅球,4 個藍球)

樣例輸出 0.62857

就是 a、b誰拿了紅的就贏,結束,最後沒人拿到紅,算 b 贏,問 a 贏的概率。牛客網上看,bfs 結果好像對,但是超記憶體了,就想到應該 bottom-up 不應該 top-down 的。(printf自動四捨五入)。

#include

#include

using

namespace std;

double

process

(int n,

int m)

}return dp[n]

[m];

}int

main()

dp[i][j]表示 i 個紅球,j 個藍球的情況下 a 獲勝的概率。顯然 j == 0 時,a必贏;i == 0時,a必輸;乙個紅球,乙個藍球,a 獲勝概率 50%。

上邊的第一種情況(i + j < 3 || j <= 1),也就是最多三個人各摸乙個球肯定就結束了,這時dp[i][j]就是 a 上來就摸到紅球的概率:ii+

j\frac

i+ji

​上邊的第二種情況(j < 3),dp[i][j]有兩個組成部分:

1、i i+

j\frac

i+ji

​:a直接摸到紅球的概率

2、j i+

j⋅j−

1i+j

−1⋅i

i+j−

2⋅dp

[i−1

][j−

2]

\frac \cdot \frac \cdot \frac \cdot dp[i - 1][j - 2]

i+jj​⋅

i+j−

1j−1

​⋅i+

j−2i

​⋅dp

[i−1

][j−

2]:a藍、b藍、c紅,之後 a紅 的概率

上邊的第三種情況,也就是最通用的情況下,dp[i][j]有三個組成部分:

1、i i+

j\frac

i+ji

​:a直接摸到紅球的概率

2、j i+

j⋅j−

1i+j

−1⋅j

−2i+

j−2⋅

dp[i

][j−

3]

\frac \cdot \frac \cdot \frac \cdot dp[i][j - 3]

i+jj​⋅

i+j−

1j−1

​⋅i+

j−2j

−2​⋅

dp[i

][j−

3]:a藍、b藍、c藍,之後 a紅 的概率

3、j i+

j⋅j−

1i+j

−1⋅i

i+j−

2⋅dp

[i−1

][j−

2]

\frac \cdot \frac \cdot \frac \cdot dp[i - 1][j - 2]

i+jj​⋅

i+j−

1j−1

​⋅i+

j−2i

​⋅dp

[i−1

][j−

2]:a藍、b藍、c紅,之後 a紅 的概率

2019愛奇藝機試題 紅藍球

袋子中裝有n個紅球和m個藍球,a,b,c,三人依次抽取小球,若a抽到紅球則勝出,b抽到紅球則a失敗,c陪跑,純粹出來搗亂。但如果袋內紅球被抽完還未決斷勝負,則判定為b勝出。求a勝出概率。模擬抽球過程,採用遞迴的方式實現概率計算。n,m int x for x in input split defpr...

等概率放球

題目 有乙個機器按自然數序列的方式吐出球 1號球,2號球,3號球,你有乙個袋子,袋子最多只能裝下k個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第n號球的時候 n k 你袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個,被選進袋子的概率都是k n frac nk ...

模擬賽 紅藍牌

題目 明明有n張牌,正面按編號寫有數字1到n 每個數字只出現一次 每張牌的反面根據正面的數字塗上兩種顏色。如果正面的數字是質數,則為紅色,反之為藍色。明明的老師從這n張牌裡選出了一些,按數字從小到大排序後全部反面向上放成一行。他要明明判斷這些牌上的數字。輸入格式 第一行 乙個正整數n,1 n 100...