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]~
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int N = 100010; 6 double dp[N], p; 7 int T, n; 8 int main() 9 { 10 scanf("%d", &T); 11 while(T--){ 12 scanf("%d%lf", &n, &p); 13 dp[n] = 0; 14 for(int i = n - 1; i; --i){ 15 double pi = p * i * (n - i) * 2 / n / (n - 1); 16 dp[i] = dp[i + 1] + 1 / pi; 17 } 18 printf("%.3lf\n", dp[1]); 19 } 20 return 0; 21 }