CF 148D Bag of mice 概率DP

      刚开始总感觉dp用一维就可以了,dp[i]表示第i局公主获胜的概率,然后卡在了逃出的是白鼠黑鼠的判断上,两种状态需要分开讨论,但是在概率上又会同时对后续结果有影响,与此同时 这两种情况又是不共存的,所以考虑二维数组,如果i表示第几局的话,dp[i][j]中j打死我也想不到有价值的表示意义。所以我肯定刚开始的思路都是错误的。。。

     换思路,=.= 想不通, 好吧看题解。。。。。。。。。。。。。-.-|| 我偏了 。  很偏的那种。。。 

    下面介绍前辈的做法:dp[i][j]表示白鼠黑鼠数量分别为i,j 时公主获胜的概率,状态转换呼之欲出。。。=.=  

   

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
double dp[1002][1002];
int main()
{
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF){
        int i,j;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=a;i++) dp[i][0]=1;
        for(i=1;i<=a;i++)
            for(j=1;j<=b;j++){
                dp[i][j]+=(double)i/(i+j);
                if(j>=3) dp[i][j]+=((double)j/(i+j))*((double)(j-1)/(i+j-1))*((double)(j-2)/(i+j-2))*dp[i][j-3];
                if(j>=2) dp[i][j]+=((double)j/(i+j))*((double)(j-1)/(i+j-1))*((double)i/(i+j-2))*dp[i-1][j-2];
            }
          printf("%.9lf\n",dp[a][b]);
      }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值