[概率dp] cf 148D Bag of mice

来源:互联网 发布:cad软件哪个好 编辑:程序博客网 时间:2024/06/11 06:41

题目分析

    用dp[i][j][0]表示i只白鼠、j只 黑鼠、公主先手时公主赢的概率,而相应的dp[i][j][1]则为公主后手。
    本题状态想麻烦了,其实dp[i][j]也可推,这种两个交替的可以多想一步的。

代码

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<map>#include<algorithm>using namespace std;const double eps=1e-9;const int maxn=1005;double dp[maxn][maxn][2];int w,b;int main(){    cin>>w>>b;    dp[0][0][0]=0;    dp[0][0][1]=0;    for(int i=1;i<=w;i++)    {        dp[i][0][0]=1;        dp[i][0][1]=0;    }    for(int j=1;j<=b;j++)    {        dp[0][j][0]=0;        dp[0][j][1]=0;    }    for(int i=1;i<=w;i++)        for(int j=1;j<=b;j++)        {           dp[i][j][0]=(i+0.0)/(i+j)+(j+0.0)/(i+j)*dp[i][j-1][1];           if(j>1) dp[i][j][1]=(j+0.0)/(i+j)*           (               (i+0.0)/(i+j-1)*dp[i-1][j-1][0]+               (j-1.0)/(i+j-1)*dp[i][j-2][0]//注意这里也要乘上各自的概率           );           else dp[i][j][1]=(j+0.0)/(i+j)*dp[i-1][j-1][0];        }    printf("%.11f\n",dp[w][b][0]);    return 0;}
0 0
原创粉丝点击