题意:开始你有k个毛球,每个毛球每一代有概率产生0,1,2,...个毛球(具体由输入给出)。求这些毛球在m代时(包括之前)灭绝的概率。
思路:概率dp。如果将每种可能完全展开的话,树的最后一层可以达到1000^1000,是实现不了的。对于每一个毛球来说,它的繁殖和死亡都是独立的。那么我们可以计算1个毛球恰好1代灭绝,2代灭绝的概率......按照书上的说法是利用了全概率公式。我写这题的时候WA了,但是感觉输出没问题,翻了下别人的解题报告,看到居然用的是long double。。。这题果断是坑啊。。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <assert.h>
#include <set>
#include <ctype.h>
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
using namespace std;
int n;//分支数
int k;//数量
int m;//天数
long double p[1010];
long double dp[1010];
int main(){
int tt;
cin>>tt;
int cas=0;
while(tt--){
cas++;
cin>>n>>k>>m;
//init
for(int i=0;i<=m;i++)dp[i]=0.0;
//
for(int i=0;i<n;i++)cin>>p[i];
dp[1]=p[0];
long double ans=dp[1];
for(int day=2;day<=m;day++){
long double t=1.0;
for(int i=1;i<n;i++){
t*=dp[day-1];
dp[day]+=p[i]*t;
}
ans+=dp[day];
}
long double tmp=1.0;
for(int i=1;i<=k;i++){
tmp*=ans;
}
printf("Case #%d: %.7lf\n",cas,tmp);
}
return 0;
}