【UVa11021】Tribles

题目描述

输入

输出

样例输入

4
3 1 1
0.33
0.34
0.33
3 1 2
0.33
0.34
0.33
3 1 2
0.5
0.0
0.5
4 2 2
0.5
0.0
0.0
0.5

样例输出

Case #1: 0.3300000

Case #2: 0.4781370

Case #3: 0.6250000

Case #4: 0.3164062



题解

概率dp。设dp[ i ] 表示开始有一个麻球,第 i 天全部死亡的概率。考虑dp[ i+1 ],枚举第一天生出麻球的个数 j ,那么 dp[ i+1 ] = ( dp[ i ] ) j。转移方程:

                                                       dp[ i ] = Σ p[ j ] * dp[ i-1 ]j

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long

const int maxn=1000+50;

int T,k,m,n,tmp;
double dp[maxn],p[maxn];

template<typename T>void read(T& aa){
    char cc; ll ff;aa=0;cc=getchar();ff=1;
    while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
    if(cc=='-') ff=-1,cc=getchar();
    while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
    aa*=ff;
}

int main(){
    read(T);
    while(T--){
        memset(dp,0,sizeof(dp));
        read(n),read(k),read(m);
        for(int i=0;i<n;i++) scanf("%lf",&p[i]);
        dp[1]=p[0];
        for(int i=2;i<=m;i++)
        for(int j=0;j<n;j++){
            dp[i]+=p[j]*pow(dp[i-1],j);
        }
        printf("Case #%d: %.7lf\n",++tmp,pow(dp[m],k));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/rlddd/p/9588034.html