SPOJ 4060 A game with probability

概率DP

刚开始想简单了233……以为一个石子的时候都主动取,多余一个石子的时候都主动不取……感觉对博弈一无所知

正确姿势:记f[i]表示剩i个石子,先手胜概率,g[i],后手胜概率。事实上,有i个石子时的决策只跟f[i-1]和g[i-1]的大小有关。如果前者大,那双方都希望自己在下一轮充当先手,否则希望充当后手。根据这个来DP就行了。

事后打表发现取和不取的决策和当前石子的奇偶有关,interesting

#include<cstdio> 
using namespace std;
namespace runzhe2000
{
    double f[2], g[2];
    void main()
    {
        int T; scanf("%d",&T);
        for(; T--; )
        {
            int n, cur = 0; double p, q; scanf("%d%lf%lf",&n,&p,&q);
            f[1] = 0; g[1] = 1; n > 1000 ? n = 1000 : 0;
            for(int i = 1; i <= n; i++, cur ^= 1)
            {
                if(f[cur^1] > g[cur^1]) // 不取 
                {
                    f[cur] = (p*(1-q)*f[cur^1]+(1-p)*g[cur^1])/(1-p*q);
                    g[cur] = (q*(1-p)*g[cur^1]+(1-q)*f[cur^1])/(1-p*q);
                }
                else // 取 
                {
                    f[cur] = (p*g[cur^1]+(1-p)*q*f[cur^1])/(1-(1-q)*(1-p));
                    g[cur] = (q*f[cur^1]+(1-q)*p*g[cur^1])/(1-(1-q)*(1-p));
                }
            }
            printf("%.6lf\n",f[cur^1]);
        }
    }
}
int main()
{
    runzhe2000::main();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值