UVA11021 Tribles (概率dp)

题目链接:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=22&page=show_problem&problem=1962

每只麻雀的后代都是独立的,所以单独考虑一只麻雀及其后代 \(m\) 天后均死亡的概率

\(f[i]\) 表示 \(i\) 天后麻雀均死亡的概率,则由全概率公式,第一只麻雀死亡时产生 \(j\) 只后代时,\(i\) 天后均死亡的概率为 \(p[j]*f[i-1]^j\),即新出生的麻雀在 \(i-1\) 天后均死亡的概率

最终答案即为 \(f[m]^k\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn = 1010;

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

ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }

int main(){
	scanf("%d", &T);
	for(int kase = 1 ; kase <= T ; ++kase){
		memset(f, 0, sizeof(f));
		scanf("%d%d%d", &n, &k, &m);
		for(int i = 0 ; i < n ; ++i){
			scanf("%lf", &p[i]);
		}
		
		f[0] = 0; 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: %.7lf\n", kase, pow(f[m], k));
	}
	return 0;
}
posted @ 2021-08-10 17:45  Tartarus_li  阅读(19)  评论(0编辑  收藏  举报