UVA 11021(概率DP)

题目链接:UVA 11021

解题思路:
这题算是一道很经典的概率入门题了吧,不过首先得知道可以用pow函数。虽然题目中讲的是K个毛球,但是其实可以考虑一个毛球的情况,之后作K次方即为答案。状态dp[i]表示一个毛球在第 i 天之前死光的概率,因为一直毛球有N种繁衍后代的可能性,dp[i]的值为N种可能性在 i-1 天内死光的可能性之和,状态转移方程为:
dp[i] = p[0]*dp[i-1]^0 + p[1]*dp[i-1]^1 + … + p[N-1]*dp[i-1]^(N-1)

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int K,n,m;
double a[1005],dp[1005],ans;

int main()
{
    int T,t=0;
    scanf("%d",&T);
    while(t<T)
    {
        scanf("%d %d %d",&n,&K,&m);
        for(int i=0;i<n;i++)
            scanf("%lf",&a[i]);

        dp[1]=a[0];
        for(int i=2;i<=m;i++)
        {
            dp[i] = a[0];
            for(int j=1;j<n;j++)
            {
                dp[i] += a[j] * pow(dp[i-1], j);
            }
        }

        printf("Case #%d: %.7lf\n",++t, pow(dp[m], K));
    }

    return 0;
}

你可能感兴趣的:(UVA 11021(概率DP))