1. 程式人生 > 其它 >UVA11021 Tribles 概率+期望

UVA11021 Tribles 概率+期望

題目傳送門

題意

  現有\(k\)只麻球,每隻麻球只能存活一天,在每隻麻球死前有\(P_i\)的概率生出額外的\(i\)只麻球,求出\(m\)天內所有麻球都死亡的概率。

思路

  由於每隻麻球繁衍是獨立進行的,因此我們可以將\(k\)只麻球看作是\(k\)個獨立的族群,於是求出\(m\)天內所有麻球都死亡的概率就可以認為是\(m\)天內\(k\)個族群全部滅絕的概率。由於麻球都只能存活一天,並且獨立存活,因此我們只需要思考一隻麻球的情況,然後推廣到所有即可。
  對於一隻麻球來說,假設其第\(i\)天所有後代都死亡的概率為\(f[i]\)。由於獨立性,所有後代都可以看成是第一天的麻球,因此對於第\(i\)

天,根據全概率公式,該麻球滅絕的概率為\(f_i=\sum_{j=0}^{n-1}P_{j}(f_{i-1})^j\)
  \(P_{j}(f_{i-1})^j\)表示該麻球生了\(j\)個後代,並且全部都在\(i-1\)天內死亡,每個後代死亡的概率均為\(f_{i-1}\),因此根據乘法公式,\(j\)只後代在\(i-1\)天內全部死亡的概率為\((f_{i-1})^j\)
  如此求出\(f[m]\)後,\(k\)只麻球在\(m\)天內滅絕的概率即\(f[m]^k\)

參考程式碼

點此展開
//Author:Daneii
#include <bits/stdc++.h>

using namespace std;

#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
#define din(x) scanf("%lf",&x)

typedef long long ll;
typedef long double ld;
typedef pair<int,int> PII;

const int N=1010;

double p[N];
double f[N];

int main()
{
    int T;
    in(T);

    int kase=0;
    while(T--)
    {
        int n,k,m;
        in(n);in(k);in(m);
        for(int i=0;i<n;i++)  din(p[i]);

        f[0]=0,f[1]=p[0];//注意初始化
        for(int i=2;i<=m;i++)
        {
            f[i]=0;//有多組資料,需要清空
            for(int j=0;j<n;j++)
            {
                f[i]+=p[j]*pow(f[i-1],j);
            }
        }

        printf("Case #%d: %.7lf\n",++kase,pow(f[m],k));
    }

    return 0;
}