SPOJ 4060 A game with probability

Posted Mr_Wolfram的高维空间

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPOJ 4060 A game with probability相关的知识,希望对你有一定的参考价值。

博弈论+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的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 2318 2318: Spoj4060 game with probability Problem(概率DP)

BZOJ2318Spoj4060 game with probability Problem 概率

bzoj2318Spoj4060 game with probability Problem

QtCreator中pro项目文件格式说明

SPOJ QTREE 树链剖分

SPOJ QTREE - Query on a tree