[COGS1487]麻球繁衍(概率dp)

题目描述

传送门

题解

f(i) 表示开始有1只麻球,i天之后全部死亡的概率。由全概率公式有

f(i)=P0+P1f(i1)+P2f(i1)2+P3f(i1)3+...+Pn1f(i1)n1

其中 Pjf(i1)j 的含义是这个麻球生了j个后代,它们在i-1天后全部死亡。注意这j个后代的死亡时独立的,而每一死亡的概率都是 f(i1) ,因此根据乘法原理,j个后代全部死亡的概率为 f(i1)j 。同理,由于一开始共有k只麻球,且各只麻球的死亡是独立的,由乘法原理,最终答案是 f(m)k

摘自刘汝佳《算法竞赛入门经典训练指南》

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath> 
using namespace std;
const int N=1005;
int T,n,k,m;
double p[N],f[N];
inline double fast_pow(double a,int p){
    double ans=1;
    for (;p;p>>=1,a*=a)
      if (p&1)
        ans*=a;
    return ans;
}
int main(){
    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]);
        memset(f,0,sizeof(f));
        f[0]=0; f[1]=p[0];
        for (int i=2;i<=m;++i)
          for (int j=0;j<n;++j) f[i]+=p[j]*fast_pow(f[i-1],j);
        printf("Case #%d: %0.7lf\n",t,fast_pow(f[m],k));
    }
}

你可能感兴趣的:(dp,概率,cogs)