hdu 1204 糖果大戰 概率

題意:

兩人比賽(定義成甲和乙),兩人一開始分別有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過程(馬爾科夫過程)
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章