CF148D--Bag of mice+概率期望dp

第一道概率期望dp:)

其实和一般的dp也差不多,只要状态选好就行了。


定义dp[i][j]表示还剩i只白老鼠j只黑老鼠时候公主赢得概率。

则:1.公主选白老鼠,直接赢,概率:i/(i+j)

        2.公主选黑老鼠

             1)龙选黑老鼠,逃走黑老鼠;概率:j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)

             2)  龙选黑老鼠,逃走白老鼠;概率:j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)

             3) 龙选白老鼠,这样公主是必输的,不用考虑

然后dp[i][j]等于以上概率之和。

初始化时,如果只要白老鼠则获胜概率为1

如果只要黑老鼠则获胜概率为0



代码如下:


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

double dp[1100][1100];

int main()
{
    int w,b;
    while(scanf("%d%d",&w,&b)!=EOF)
    {
        for(int i=1;i<=w;i++)
           dp[i][0]=1;
        for(int j=1;j<=b;j++)
           dp[0][j]=0;
        for(int i=1;i<=w;i++)
          for(int j=1;j<=b;j++)
          {
              dp[i][j]=1.0*i/(i+j);
              if(j>=3)
                 dp[i][j]+=j*1.0/(i+j)*(j-1)*1.0/(i+j-1)*(j-2)*1.0/(i+j-2)*dp[i][j-3];
              if(j>=2)
                 dp[i][j]+=j*1.0/(i+j)*(j-1)*1.0/(i+j-1)*i*1.0/(i+j-2)*dp[i-1][j-2];
          }
        printf("%.9lf\n",dp[w][b]);
    }
  return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值