游戏(期望)
這是一個(gè)期望的題目,有兩種做法。
一種是比較好想的高斯消元,另一種是思維難度稍微大了一些的數(shù)學(xué)做法,但是代碼很短,時(shí)間復(fù)雜度也更優(yōu)秀。
(高斯消元做法)
以前沒(méi)有怎么做過(guò)期望的題目,更是沒(méi)有想到可以用高斯消元來(lái)做期望的題目。
但是現(xiàn)在發(fā)現(xiàn)其實(shí)這是個(gè)挺常見(jiàn)的套路,所以就學(xué)習(xí)了一下qwq
有興趣的話可以去做一下HNOI2013游走,這個(gè)也是高斯消元來(lái)求解未知數(shù)的期望類型題目。
(數(shù)學(xué)做法)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define MAXN 110 using namespace std; long double sum[MAXN],p,ans=1.0; int n,m; int main() {cin>>n>>m;cin>>p;sum[0]=1.0;for(int i=1;i<=n+m;i++)sum[i]=sum[i-1]*(1-p)/p,ans+=sum[i];printf("%.8Lf",(1/(sum[n]/ans)));return 0; }其實(shí)這個(gè)題有類似的題目收集郵票有興趣的話可以嘗試一下,思路很相近。
這個(gè)做法就比較玄妙了。
我們可以這樣想:
我們把狀態(tài)進(jìn)行分離,因?yàn)锳lice和Bob的寶石總和不變,所以我們只考慮Alice的個(gè)數(shù),我們將狀態(tài)抽離出來(lái)為她擁有0~n+m這n+m+1種狀態(tài),我們要計(jì)算這些狀態(tài)在總體上的期望出現(xiàn)次數(shù)。而這些狀態(tài)之間每次都會(huì)有概率加成的轉(zhuǎn)移。
因?yàn)橛螒驎?huì)進(jìn)行無(wú)限輪(也就是無(wú)窮大),這樣的話開(kāi)始幾次的情況其實(shí)對(duì)整體的影響很小很小。而在進(jìn)行了無(wú)窮多的傳遞后,各個(gè)狀態(tài)出現(xiàn)的期望出現(xiàn)次數(shù)應(yīng)該是達(dá)到了穩(wěn)定值(當(dāng)然這其中肯定是每輪之間是有變化的,但是要理解的一點(diǎn)是,我們將狀態(tài)轉(zhuǎn)移進(jìn)行了無(wú)窮多輪,所以我們要從整體上來(lái)看,那么均攤到每個(gè)狀態(tài)的概率肯定是穩(wěn)定的、恒定的)
既然每種狀態(tài)的概率是穩(wěn)定的,那么我們考慮每次狀態(tài)的轉(zhuǎn)移。考慮狀態(tài)\(A_k\)和它的上一個(gè)狀態(tài)\(A_{k-1}\),\(A\)每次有p的概率轉(zhuǎn)移到上一個(gè)狀態(tài),它的上一個(gè)狀態(tài)有1-p的概率轉(zhuǎn)移到它。但是要維持在總體上他們的穩(wěn)定,那么就有\(A_k\times p=A_{k-1}\times (1-p)\),這樣的話我們可以知道這些狀態(tài)的分布呈公比為\(\frac{1-p}{p}\)的等比數(shù)列。那么我們假設(shè)開(kāi)始的0狀態(tài)為單位1,就可以進(jìn)行遞推了。
隨后我們可以用\(A_n\)狀態(tài)來(lái)除以總數(shù),算出在這些狀態(tài)中(如果把總和看作單位1的話),n狀態(tài)出現(xiàn)的次數(shù)(比1小)。最后我們將整個(gè)游戲的無(wú)數(shù)個(gè)回合具象成一條直線。那么n狀態(tài)就是上面的一些間隔的點(diǎn)。我們要求的問(wèn)題也可以轉(zhuǎn)化成相鄰兩個(gè)n狀態(tài)出現(xiàn)的間隔。那么就用1來(lái)除以它就可以了。
轉(zhuǎn)載于:https://www.cnblogs.com/fengxunling/p/9763816.html
總結(jié)
- 上一篇: ResDepot CRC码
- 下一篇: 【异常-举例6:finally】