ZOJ 3551 Bloodsucker <概率DP>

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3551

题意:开始有N-1个人和一个吸血鬼, 每天有两个生物见面,当人遇到吸血鬼时有p的概率变成吸血鬼,求全部变成吸血鬼所需要的时间的期望~

思路: 设dp[i] 为还有 i 个人时,有一人变成吸血鬼的期望时间, p[i]为还有 i 个人时,有人变成吸血鬼的概率,

    那么p[i]= p*i(N-i)/(N*(N-1)/2)~  dp[i]=1/p[i];

    由 E(X)=∑E(X=xi) 得 E[N]=∑dp[i]~

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = ;
double dp[N], p;
int T, n;
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d%lf", &n, &p);
dp[n] = ;
for(int i = n - ; i; --i){
double pi = p * i * (n - i) * / n / (n - );
dp[i] = dp[i + ] + / pi;
}
printf("%.3lf\n", dp[]);
}
return ;
}
上一篇:ZOJ3551 Bloodsucker(概率dp)


下一篇:【转】深度分析Java的ClassLoader机制(源码级别)