UVA11021 Tribles(概率dp)
题目
题意翻译
题目大意
一开始有kk种生物,这种生物只能活1天,死的时候有p[i]的概率产生i只这种生物(也只能活一天),询问m天内所有生物都死的概率(包括m天前死亡的情况)
输入格式
第一行输入一个整数T,表示数据总数
每一组先输入三个整数n(1<=n<=1000),k(0<=k<=1000),m(0<=m<=1000)
然后输入n个整数,分别为p_0到p_{n-1}p
输出格式
对于每一组数据,先输出"Case #x: " 再输出答案,精度要求在1e-6以内
感谢@xMinh 提供翻译
思路
每个麻球是互相独立的,所以求出一个麻球的概率然后用乘法规则即可求出k个麻球的概率。
转移时考虑这个麻球第1天繁衍多少个,它们在接下来的i−1天内死绝了。
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 10;
#define PII pair<int, int>
double a[maxn];
double f[1010];
int main()
{
int t;cin>>t;
for(int cnt=1;cnt<=t;cnt++){
int n,k,m;cin>>n>>k>>m;
memset(f,0,sizeof f);
memset(a,0,sizeof a);
for(int i=0;i<n;i++){
cin>>a[i];//有a[0]的概率生出0个后代
}
f[1]=a[0];
for(int i=2;i<=m;i++){
for(int j=0;j<n;j++){
f[i]+=a[j]*pow(f[i-1],j);
}
}
printf("Case #%lld: %.7lf\n",cnt,pow(f[m],k));
}
return 0;
}