题目:
http://codeforces.com/contest/518/problem/D
题意:
每个人上电梯的概率为p, 求出t秒时n个人上电梯的期望值.
思路:
dp[i][j] : i秒时,j个人上电梯的概率.
j < n 时, dp[i][j] = dp[i-1][j-1]*p + dp[i-1][j]*(1-p)
j = n时, dp[i][j] = dp[i-1][j-1]*p + dp[i-1][j]
CODE:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
double dp[2005][2005];
int main()
{
//freopen("in", "r", stdin);
int n, t;
double p;
while(~scanf("%d %lf %d", &n, &p, &t)) {
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= t; ++i) {
dp[i][0] += dp[i-1][0] * (1 - p);
int tmp = min(n, i);
for(int j = 0; j <= tmp; ++j) {
if(j < n) {
dp[i][j] = dp[i-1][j-1]*p + dp[i-1][j]*(1-p);
}
else dp[i][j] = dp[i-1][j-1]*p + dp[i-1][j];
}
}
double ans = 0;
for(int i = 1; i <= n; ++i) {
ans += dp[t][i] * i;
}
printf("%.10f\n", ans);
}
return 0;
}