uva1637 紙牌遊戲
36 張牌分成 9 堆,每堆 4 張牌。每次可以拿走某兩堆頂部的牌,但需要點數相同。如果有多種拿法則等概率的隨機拿。例如, 9 堆頂部的牌分別為 ks, kh, kd, 9h, 8s, 8d, 7c, 7d,6h ,則有 5 種拿法 (ks,kh), (ks,kd), (kh,kd), (8s,8d), (7c,7d),每種拿法的概率均為 1/5 。如果最後拿完所有牌則遊戲成功。按順序給出每堆牌的 4 張牌,求成功概率。樣例:–《演算法競賽入門經典(第二版)》
sample input概率問題:(aas 9s 6c ks
jc qh ac kh
7s qd jd kd
qs js 9h
6d td ad 8s
qc th kc 8d
8c 9d tc 7c
9c 7h jh 7d
8h 6s ah 6h
sample output
0.589314
)=p(
a∣b1
)p(b
1)+p
(a∣b
2)p(
b2)+
...+
p(a∣
bn)p
(bn)
p(a)=p(a|b_1)p(b_1) + p(a|b_2)p(b_2) + ... + p(a|b_n)p(b_n)
p(a)=p
(a∣b
1)p
(b1
)+p(
a∣b2
)p(
b2)
+...
+p(a
∣bn
)p(b
n)。
或者: p(a
)=p(
ab1)
+p(a
b2)+
...+
p(ab
n)
p(a)=p(ab_1)+p(ab_2)+...+p(ab_n)
p(a)=p
(ab1
)+p
(ab2
)+.
..+p
(abn
),其中 a 與 bn 的關係為交)。
九堆牌的乙個狀態設為 a,狀態 a 可以拿掉符合要求的兩張牌到 b1,b2,…,bn 多個狀態
設事件 w 為「遊戲成功」,事件 a 為「實現狀態 a 」,事件 b
ib_i
bi 為「出現狀態 b
ib_i
bi 」,則事件 (a∣
bi
)(a|b_i)
(a∣bi
) 為「出現狀態 b
ib_i
bi 的條件下遊戲成功」,事件 (w∣
a)
(w|a)
(w∣a
) 為「在狀態 a 的條件下遊戲成功」,則根據全概率公式
p (w
)=p(
w∣b1
)p(b
1)+p
(w∣b
2)p(
b2)+
...+
p(w∣
bn)p
(bn)
p(w)=p(w|b_1)p(b_1)+p(w|b_2)p(b_2)+...+p(w|b_n)p(b_n)
p(w)=p
(w∣b
1)p
(b1
)+p(
w∣b2
)p(
b2)
+...
+p(w
∣bn
)p(b
n)動態規劃
面對這樣乙個問題,我們首先可以對其進行簡化,假設只有 3 堆牌,每堆有 2 張牌。假設為:
ks kh
as kd
ac kc
第一次有 3 種拿法: (kh,kd),(kh,kc),(kd,kc),每次拿完之後牌都改變了,我們可以用乙個三元組表示狀態的改變(每個變數有 0 、 1 、 2 三種可能性,拿完之後分別對應: (1,1,2),(1,2,1),(2,1,1),如圖所示:
回到原本的題目,我們將三元組改為 9 元組即可。
完整**:
#define local
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
char card[9]
[4][
3];// 一共 9 堆,每堆 4 張牌,每張牌用兩個字元表示(還有一位為結束符)
mapint>
,double
> d;
// 用於記憶化搜尋
/** \brief 使用動態規劃找到狀態 cnt 的成功概率
* * \param cnt 表示剩餘紙牌數目的 9 元組,即表示狀態
* \param c 記錄剩餘的總的紙牌數(也可以用 cnt 求和來代替,但是**量和執行速度都會受影響)
* \return 該狀態下的成功概率
* */
double
dp(vector<
int>
& cnt,
int c)
// 把引用作為引數
if(tot ==0)
return d[cnt]=0
;return d[cnt]
=sum/tot;
}bool
read_input()
}return
true;}
intmain()
return0;
}
UVA1637 紙牌遊戲
36張牌分成9堆,每堆4張牌。每次可以拿走某兩堆頂部的牌,但需要點數相同。如果有 多種拿法則等概率的隨機拿。例如,9堆頂部的牌分別為ks,kh,kd,9h,8s,8d,7c,7d,6h,則有5種拿法 ks,kh ks,kd kh,kd 8s,8d 7c,7d 每種拿法的概率均為1 5。如果最後拿完所...
例題 10 12 紙牌遊戲 UVa 1637
題意 36張牌分成9堆,沒堆4張,每次可以拿走某兩堆頂部的牌,但需要的點數相同,如果有多種拿法就等概率隨機拿,問拿完所有牌的概率。分析 直接用9元組表示當前狀態,即每堆剩餘的牌數,狀態數為5 9 1953125。設d i 表示狀態i對應的概率,則根據全概率公式,d i 為後繼狀態的成功概率的平均值,...
UVa 1637 紙牌遊戲(全概率公式)
題意 36張牌分成9堆,每堆4張牌。每次可以拿走某兩堆頂部的牌,但需要點數相同。每種拿法的概率均為1 5。求成功概率。思路 可以用9元組來表示當前狀態,d i 表示狀態i對應的成功概率。根據全概率公式 乙個狀態的成功率,等於其後繼狀態的成功率的平均值。看到別人用vector來簡潔的表示了狀態,值得學...