1. 程式人生 > 其它 >UVA11021 Tribles(概率dp)

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;
}