UVA11427玩纸牌(全概率+递推)
生活随笔
收集整理的這篇文章主要介紹了
UVA11427玩纸牌(全概率+递推)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 一個人玩紙牌游戲,他每天最多玩n局,枚舉獲勝的概率是a/b,每天玩牌只要獲勝概率達到p,那么他今天就不玩了,明天接著玩,如果有一天他的概率沒有達到p,(沒有達到p的話他今天一定是玩了n次),那么他以后就在也不玩了,問題是在平均的情況下,他能玩多少個晚上的牌?
思路:
? ? ? 我們可以先算他只玩一天就失敗了的概率,P[i][j]表示玩了i次,贏了j次,當
j/i<=p的時候,根據全概率公式,P[i][j] = P[i-1][j]*(1-p)+P[i-1][j-1]*p前面是輸了后面是贏了,端點值是P[0][0] = 1 ,P[0][1] = 0,其他部分全都是0,記得要把其他部分清成0,因為更新是不連續的,這樣之后只玩一天的概率等于Q = P[n][0] + P[n][1] +.....
這樣答案就是(期望)
玩一天 1 * Q
玩兩天 2 * Q(1-Q)
玩三天 3 * Q(1-Q)^2
......
化簡后 Ans = 1 / Q;
說下化簡的方法吧,有兩種
(1)
? ?a 令s = EX/Q = 1+2(1-Q)+3(1-Q)^2+4(1-Q)^3+...
則
? ?b ? ? (1-Q)s = (1-Q)+2(1-Q)^2+3(1-Q)^3+....
a - b得到
EX = Qs = 1+(1-Q)+(1-Q)^2+(1-Q)^3+..=1/Q
(2)
設數學期望為e天,把情況分為兩類,第一天晚上出頭喪氣概率Q期望1,第一天晚上興高采烈,概率(1-Q)期望e + 1,解得 e = Q * 1 + (1 - Q) * (e + 1) => e = 1/Q;
#include<stdio.h>
#include<string.h>
double P[105][105];
int main ()
{
? ?int n ,a ,b ,i ,j;
? ?int t ,cas = 1;
? ?scanf("%d" ,&t);
? ?while(t--)
? ?{
? ? ? scanf("%d/%d%d" ,&a ,&b ,&n);
? ? ? double p = a * 1.0 / b;
? ? ? memset(P ,0 ,sizeof(P));
? ? ? P[0][0] = 1 ,P[0][1] = 0;
? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? for(j = 0 ;j * b <= i * a ;j ++)
? ? ? {
? ? ? ? ?P[i][j] = P[i-1][j] * (1 - p) ;
? ? ? ? ?if(j >= 1)P[i][j] += ?P[i-1][j-1] * p;
? ? ? }
? ? ? double Ans = 0;
? ? ? for(j = 0 ;j * b <= n * a ;j ++)
? ? ? Ans += P[n][j];
? ? ? printf("Case #%d: %d\n" ,cas ++ ,(int)(1 / Ans));
? ?}
? ?return 0;
}
? ?
? ? ? 一個人玩紙牌游戲,他每天最多玩n局,枚舉獲勝的概率是a/b,每天玩牌只要獲勝概率達到p,那么他今天就不玩了,明天接著玩,如果有一天他的概率沒有達到p,(沒有達到p的話他今天一定是玩了n次),那么他以后就在也不玩了,問題是在平均的情況下,他能玩多少個晚上的牌?
思路:
? ? ? 我們可以先算他只玩一天就失敗了的概率,P[i][j]表示玩了i次,贏了j次,當
j/i<=p的時候,根據全概率公式,P[i][j] = P[i-1][j]*(1-p)+P[i-1][j-1]*p前面是輸了后面是贏了,端點值是P[0][0] = 1 ,P[0][1] = 0,其他部分全都是0,記得要把其他部分清成0,因為更新是不連續的,這樣之后只玩一天的概率等于Q = P[n][0] + P[n][1] +.....
這樣答案就是(期望)
玩一天 1 * Q
玩兩天 2 * Q(1-Q)
玩三天 3 * Q(1-Q)^2
......
化簡后 Ans = 1 / Q;
說下化簡的方法吧,有兩種
(1)
? ?a 令s = EX/Q = 1+2(1-Q)+3(1-Q)^2+4(1-Q)^3+...
則
? ?b ? ? (1-Q)s = (1-Q)+2(1-Q)^2+3(1-Q)^3+....
a - b得到
EX = Qs = 1+(1-Q)+(1-Q)^2+(1-Q)^3+..=1/Q
(2)
設數學期望為e天,把情況分為兩類,第一天晚上出頭喪氣概率Q期望1,第一天晚上興高采烈,概率(1-Q)期望e + 1,解得 e = Q * 1 + (1 - Q) * (e + 1) => e = 1/Q;
#include<stdio.h>
#include<string.h>
double P[105][105];
int main ()
{
? ?int n ,a ,b ,i ,j;
? ?int t ,cas = 1;
? ?scanf("%d" ,&t);
? ?while(t--)
? ?{
? ? ? scanf("%d/%d%d" ,&a ,&b ,&n);
? ? ? double p = a * 1.0 / b;
? ? ? memset(P ,0 ,sizeof(P));
? ? ? P[0][0] = 1 ,P[0][1] = 0;
? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? for(j = 0 ;j * b <= i * a ;j ++)
? ? ? {
? ? ? ? ?P[i][j] = P[i-1][j] * (1 - p) ;
? ? ? ? ?if(j >= 1)P[i][j] += ?P[i-1][j-1] * p;
? ? ? }
? ? ? double Ans = 0;
? ? ? for(j = 0 ;j * b <= n * a ;j ++)
? ? ? Ans += P[n][j];
? ? ? printf("Case #%d: %d\n" ,cas ++ ,(int)(1 / Ans));
? ?}
? ?return 0;
}
? ?
總結
以上是生活随笔為你收集整理的UVA11427玩纸牌(全概率+递推)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA11389巴士司机问题
- 下一篇: UVA11462年龄排序