UVA11021 Tribles(概率dp)

题目大意
一开始有kk种生物,这种生物只能活1天,死的时候有p_ip
i

的概率产生ii只这种生物(也只能活一天),询问m天内所有生物都死的概率(包括m天前死亡的情况)

输入格式
第一行输入一个整数TT,表示数据总数

每一组先输入三个整数n(1<=n<=1000),k(0<=k<=1000),m(0<=m<=1000)n(1<=n<=1000),k(0<=k<=1000),m(0<=m<=1000)

然后输入n个整数,分别为p_0p
0

到p_{n-1}p
n−1

输出格式
对于每一组数据,先输出"Case #x: " 再输出答案,精度要求在1e-6以内

感谢@xMinh 提供翻译

输入输出样例
输入 #1 复制
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
输出 #1 复制
Case #1: 0.3300000
Case #2: 0.4781370
Case #3: 0.6250000
Case #4: 0.3164062

分析:

用f[m]表示1中生物在m天内全部死亡的概率,题目中有k中生物,则k种生物在m天内全部死亡的概率是(f[m])^k。
第一天死亡的概率是p[0](即不产生新的生物)f[m]=p[0]
第二天死亡的概率是第一天可能产生的新生物的数量乘以所有生物在第一天死亡的概率 f[m]=p[0]+p[1](f[1])+p[2] * (f[1])^2+…p[n-1](f[1]) ^ (n-1)
因为生物都只会活一天,所以计算f[i]的时候只需要考虑第一天产生的可能的生物的数量在i-1天死亡的概率。
f[i]=p[0]+p[1]*(f[i-1])+p[2] * (f[i-1])^2+… p [n-1] * (f[i-1]) ^ (n-1)
每天产生p只新生物,那么p只需要同时在i-1天内死亡。所以是p次方

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+10;
double p[N],f[N];
int main()
{
	int T;
	scanf("%d",&T);
	int t=0;
	while(T--)
	{
		t++;
		int n,k,m;
		scanf("%d%d%d",&n,&k,&m);
		for(int i=0;i<n;i++)
		{
			scanf("%lf",&p[i]);
		}
		memset(f,0,sizeof(f));
		f[1]=p[0];
		for(int i=2;i<=m;i++)
		{
			for(int j=0;j<n;j++)
			{
				f[i]+=p[j]*pow(f[i-1],j); 
			}
		}
		printf("Case #%d: %.7f\n",t,pow(f[m],k));
	}
	return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值