题意:
最初有
k
只毛球,每只毛球只能活一天,给定每只毛球临死前可以产生后代的概率,求问
分析:
首先明确每只毛球各自独立,那么我们实际上只要分析一只毛球的情况,最后全部乘起来即可。
设
那么有
dp[i]=p0+p1∗dp[i−1]+p2∗dp[i−1]2+...+p[n−1]∗dp[i−1]n−1
最后 所求的即为
dp[m]
。
关键是分析到每只毛球的存活和繁衍都是独立的
代码:
/*************************************************************************
> File Name: 11021.cpp
> Author: jiangyuzhu
> Mail: 834138558@qq.com
> Created Time: 2016/8/1 9:20:33
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const int maxn = 1e3 + 5;
double dp[maxn];
double p[maxn];
int main (void)
{
int T;scanf("%d", &T);
for(int tt = 1; tt <= T; tt++){
int n, m, k;scanf("%d%d%d",&n, &k, &m);
for(int i = 0; i < n; i++){
scanf("%lf", &p[i]);
}
memset(dp, 0, sizeof(dp));
dp[1] = p[0];
for(int i = 2; i <= m; i++){
for(int j = 0; j < n; j++){
dp[i] += p[j] * pow(dp[i - 1], j);
}
}
double ans = pow(dp[m], k);
printf("Case #%d: %.10f\n", tt, ans);
}
return 0;
}