• 【BZOJ2318】【spoj4060】game with probability Problem 概率DP


    链接:

    #include <stdio.h>
    int main()
    {
        puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢");
        puts("网址:blog.csdn.net/vmurder/article/details/46467899");
    }

    题解:

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


    gi 表示剩 i 个石头、 A 后手的获胜概率。

    假设想选,对于 fi
    p 的概率进入 gi1 ;有 1p 的概率进入 gi
    所以 fi=pgi1+(1p)gi

    假设想选。对于 g(i)
    q 的概率进入 fi1 ;有 1q 的概率进入 fi
    所以 gi=qfi1+(1q)fi

    整理得:

    fi=pgi1+(1p)qfi11(1p)(1q)

    gi=qfi1+(1q)pgi11(1p)(1q)

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


    fi1>gi1 都不想选。


    fi1<gi1 都想选。
    然后对于不想选的情况。那么 p=1pq=1q 即可了。

    然而这样就没法用矩阵乘法了。


    就须要黑科技,,当n非常大时,事实上概率已经基本不动了。。让n=min(n,1000)就好了Qwq。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define N 1010
    using namespace std;
    double f[N],g[N],p,q;
    
    int main()
    {
        int i,T,n;
        for(scanf("%d",&T);T--;)
        {
            scanf("%d",&n),n=min(n,1000);
            scanf("%lf%lf",&p,&q);
            f[0]=0,g[0]=1;
            for(i=1;i<=n;i++)
            {
                if(f[i-1]>g[i-1])p=1-p,q=1-q;
                f[i]=(p*g[i-1]+(1-p)*q*f[i-1])/(1-(1-p)*(1-q));
                g[i]=(q*f[i-1]+(1-q)*p*g[i-1])/(1-(1-p)*(1-q));
                if(f[i-1]>g[i-1])p=1-p,q=1-q;
            }
            printf("%.6lf
    ",f[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    【WPF学习】第四十八章 理解WPF动画
    【WPF学习】第四十七章 WriteableBitmap类
    【WPF学习】第四十六章 效果
    【WPF学习】第四十五章 可视化对象
    【WPF学习】第四十四章 图画
    【WPF学习】第四十三章 路径和几何图形
    【WPF学习】第四十二章 透明
    【WPF学习】第四十一章 变换
    【WPF学习】第四十章 画刷
    【WPF学习】第三十九章 理解形状
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5254139.html
Copyright © 2020-2023  润新知