概率論之概率dp與期望的極限求解

http://acm.hust.edu.cn/vjudge/problem/35396

題意:小明玩兒紙牌,每盤獲勝的概率爲p。小明只有當該晚的獲勝局數嚴格大於p時纔回去高興的睡覺。小明每晚最多隻能玩兒n次遊戲,如果獲勝比例一直小於p,就只能垂頭喪氣去睡覺,並以後都不玩兒了。求小明玩兒牌天數的期望。

解析:可以獨立的求出小明每晚失敗的概率。利用概率dp,設dp[i][j]表示前i局中贏的概率都沒超過p,且贏了j次。那麼最終失敗肯定是已經玩兒了n此遊戲 = dp[n][0] + dp[n][1] + ……+dp[n][n -1] 因爲p小於1,不可能dp[n][n] > 0.當j / i <= p有狀態方程 dp[i][j] = dp[i - 1][j] * (1 - p ) + dp[i - 1][j - 1]  * p,注意邊界處理dp[0][0] = 1;最後求出每晚輸了的概率爲Q。那麼小明玩兒牌的天數爲:極限Q * 1 + (1-Q)*Q * 2 + (1-Q)^2 * Q * 3 ……

然後利用高中數學的知識.另s = EX / Q = 1 + 2 * (1 - Q) + 3 * (1 - Q) ^2……

s * (1 - Q) = 1 * (1 - Q )  + 2 * (1- Q ) ^2……

解得EX = 1 / Q

代碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
using namespace std;
double dp[105][105];
int main()
{
	//freopen("in.txt","r",stdin);
	int n;
	scanf("%d",&n);
	int fenzi,fenmu,x;
	        double p,Q;
	for(int t= 0; t < n; t ++)
    {
        Q = 0;

        scanf("%d/%d%d",&fenzi,&fenmu,&x);
        p = 1.0*fenzi / fenmu ;
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1.0;
        for(int i = 1; i <= x; i ++ )
        {
            for(int j = 0; j * fenmu <= fenzi * i; j ++)//將除法換爲乘法保證精度
            {
                dp[i][j] = dp[i - 1][j] * (1 - p);
                dp[i][j] +=  dp[i - 1][j - 1] * p;
            }
        }
        for(int i = 0; i < x; i ++)
        {
            Q += dp[x][i];
        }
       double  ans = 1 / Q;
        printf("Case #%d: %.d\n",t + 1,(int)ans);
    }
	return 0;
}


發佈了132 篇原創文章 · 獲贊 17 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章