題意:
兩人比賽(定義成甲和乙),兩人一開始分別有n和m個糖果,玩24點,每贏一局從對方那裏獲得一個糖果,誰先沒有糖果誰輸。兩個人能解除24點的概率分別爲a和b,若都解出或都沒解出則爲平局,不交換糖果。求甲贏的概率。
題解:
一個Markov過程的應用。詳細信息鏈接:Markov過程-百度文庫
具體Markov過程沒有怎麼了解,基本概念是馬可夫過程的條件概率僅僅與系統的當前狀態相關,而與它的過去歷史或未來狀態,都是獨立、不相關的。
這題相當於賭徒問題的變形(只是加了平局)。
具體過程:
設0<=j<=n+m;uj爲從j個糖果到達0個糖果狀態先於到達n+m個糖果狀態的概率。
那麼uj=p*u(j+1)+q*u(j-1)+(1-p-q)*uj(p爲甲勝的概率,q爲乙勝的概率,這個公式的意思是j狀態可以轉到的狀態)
(p+q)uj=p*u(j+1)+q*u(j-1)化簡後即跟賭徒問題一樣了。(其中p=a*(1-b),q=b*(1-a))
之後的情況見下圖:
#include <cstdio>
#include <cstdlib>#include <cmath>
#include <ctime>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <iomanip>
using namespace std;
const double eps=1e-12;
int main()
{
int n,m;
double p,q;
while(scanf("%d%d%lf%lf",&n,&m,&p,&q)!=EOF)
{
double ans,r;
if(m==0)ans=1;//如果m=0,那麼即使n=0也會贏
else if(n==0||p==0||q==1)ans=0;
else
{ //r=我勝/他勝;
r=q*(1-p)/(p*(1-q));//Speakless勝的概率p*(1-q)
if(fabs(r-1.0)<eps)ans=1.0*n/(n+m);//勝率相等
else ans=(1-pow(r,n))/(1-pow(r,n+m));
}
printf("%.2f\n",ans);
}
return 0;
}
/*
Markov過程(馬爾科夫過程)
*/