cogs 1487. 麻球繁衍(概率dp)

这里写图片描述
这里写图片描述

分析:
概率dp.first

由于每只麻球,在出生之后就可以独立生活了,
所以我们可以只计算出一开始只有一个麻球,m天后全部死亡的概率
全概率公式得:

假设A1,A2,A3,…..An为一个完备事件组,
B是一个事件
已知P(Ai)和P(B|Ai),i=1,2,3,…..,n
则P(B)=P(B*A1)+P(B*A2)+……+P(B*An)=
P(A1)*P(B|A1)+P(A2)*P(B|A2)+…….+P(An)*P(B|An)
用求和符号写出就是:P(B)=∑P(Ai)P(B|Ai)
此公式为全概公式

这里写图片描述

我们可以得到这样一个柿子
这里写图片描述
Pi就是产生i个麻球的概率
f(i-1)表示一个麻球在i-1天之前连同ta的后代全部死掉的概率
因为每个麻球是独立繁衍的
所以产生了j个,全部死亡的概率就是f(i-1)^j

同理,由于一开始有k只麻球,且各只麻球的生存是独立的,
由乘法原理可以得到最后答案是
f(m)^k

这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

const int N=10005;
double f[N],p[N];
int n,m,t,k;

double KSM(double x,int b)
{
    double ans=1;
    for (int i=1;i<=b;i++)
        ans*=x;
    return ans;
}

int main()
{
    //freopen("tribbles.in","r",stdin);
    //freopen("tribbles.out","w",stdout);
    scanf("%d",&t);
    for (int T=1;T<=t;T++)
    {
        scanf("%d%d%d",&n,&k,&m);
        for (int i=0;i<n;i++)
            scanf("%lf",&p[i]);
        f[0]=0;
        f[1]=p[0];
        for (int i=2;i<=m;i++)
        {
            f[i]=0;
            for (int j=0;j<n;j++)
                f[i]+=p[j]*KSM(f[i-1],j);
        }
        printf("Case #%d: %.7lf
",T,KSM(f[m],k));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673136.html