题目描述
输入
输出
样例输入
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 ",++tmp,pow(dp[m],k)); } return 0; }