POJ 2096 Collecting Bugs(概率DP)

来源:互联网 发布:传世登陆器源码 编辑:程序博客网 时间:2024/05/21 22:50

思路:dp[i][j]表示已发现i个类别,s个子系统。那么下一天可能有四种情况。则dp[i][j]=(dp[i][j]+1)p1+(dp[i+1][j]+1)p2+(dp[i][j+1]+1)p3+(dp[i+1][j+1]+1)p4。特别要注意浮点数的处理。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=1008;int n,s;double dp[maxn][maxn];int main(){    while(cin>>n>>s)    {        memset(dp,0,sizeof(dp));        for(int i=n;i>=0;i--)        {            for(int j=s;j>=0;j--)            {                if(i==n&&j==s) continue;                double q=(double)i/n;                double w=(double)j/s;                double p1=(double)q*w;                double p2=(double)(1-q)*w;                double p3=(double)q*(1-w);                double p4=(double)(1-q)*(1-w);                dp[i][j]=(double)((dp[i+1][j]+1)*p2+(dp[i][j+1]+1)*p3+(dp[i+1][j+1]+1)*p4+p1)/(1-p1);            }        }        printf("%.4f\n",dp[0][0]);    }    return 0;}


0 0
原创粉丝点击