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;
}
posted @ 2022-03-18 21:14  kingwzun  阅读(22)  评论(0编辑  收藏  举报