UVa1637 紙牌遊戲

2021-08-26 15:27:16 字數 2964 閱讀 2887

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

as 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

概率問題:(a

)=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來簡潔的表示了狀態,值得學...