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;
}