首页 > 代码库 > CF148D--Bag of mice+概率期望dp

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;
}



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