码迷,mamicode.com
首页 > 其他好文 > 详细

SPOJ 4060 A game with probability

时间:2018-03-04 17:12:16      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:ref   href   init   using   scanf   AC   链接   gpo   cpp   

博弈论+dp+概率

提交链接-
题意不是很好懂

Ai 表示剩 i 个石头、 A 先手的获胜概率。
Bi 表示剩 i 个石头、 B先手的获胜概率。

如果想选,对于 Ai:
有 p 的概率进入 Bi?1 ;有 1?p 的概率进入 Bi
所以 fi=p?Bi?1+(1?p)?Bi

如果想选,对于 Bi:
有 q 的概率进入 Ai?1 ;有 1?q 的概率进入 Ai
所以 gi=q?Ai?1+(1?q)?Ai

如果不想选, 把 p 变成 1 - p, q 变成 1 - q 即可

为了满足递推关系,我们把 Bi 带入到 Ai 的式子中,
整理得:

Ai=(p?Bi-1 +(1?p)?q?Ai-1 )/(1-(1?p)?(1?q))

Bi=(q?Ai-1+(1?q)?p?Bi?1)/(1?(1?p)?(1?q))

然后剩 i 个石头时A的想不想选的意愿与 Ai?1、Ai?1 的大小关系有关。

Ai?1>Bi?1 都不想选。

因为 A 如果选了,就到了 Bi - 1,获胜概率就小了

如果 B 选了, 就到了 Ai - 1, A的获胜概率就大了,B 的获胜概率就小了

Bi?1<Bi?1 都想选。

同理

然后对于不想选的情况,那么 p=1?p,q=1?q 就行了。

然而这样就没法用矩阵乘法了。。。
就需要黑科技,,当n很大时,其实概率已经基本不动了,,让n=min(n,1000)就好了.

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int init() {
    int rv = 0, fh = 1;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') fh = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        rv = (rv<<1) + (rv<<3) + c - '0';
        c = getchar();
    }
    return fh * rv;
}
int T, n;
double a[1005], b[1005], p, q;
int main() {
    T = init();
    while(T--) {
        n = init();
        n = min(n, 1000);
        scanf("%lf%lf", &p, &q);
        a[0] = 0.0; b[0] = 1.0;
        for(int i = 1 ; i <= n ; i++) {
            if(a[i - 1] > b[i - 1]) {p = 1 - p; q = 1 - q;}
            a[i] = p / (1 - (1 - p) * (1 - q)) * b[i - 1] + 
                (1 - p) * q / (1 - (1 - p) * (1 - q)) * a[i - 1];
            b[i] = q / (1 - (1 - p) * (1 - q)) * a[i - 1] + 
                (1 - q) * p / (1 - (1 - p) * (1 - q)) * b[i - 1];
            if(a[i - 1] > b[i - 1]) {p = 1 - p; q = 1 - q;}
        }
        printf("%.6lf\n",a[n]);
    }
    return 0;
}

SPOJ 4060 A game with probability

标签:ref   href   init   using   scanf   AC   链接   gpo   cpp   

原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/8505040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!