n个人在排成一队在电梯面前,最前面的人每一秒钟会进行一次选择,有p的概率进电梯,有1-p的概率停在原地。每个人只有他前面的人都进电梯了,他才有可能进电梯。求t秒之后,进电梯人数的期望值。
输入描述:
一行三个数n t p(n,t是不超过2000的整数;p是浮点数,范围在[0,1]之间)。
输出描述:
输出t秒钟后,电梯中人数的期望值。保留6位小数。
示例1
输入
1 1 0.50
输出
0.500000
填表法:
dp[i][j] = dp[i-1][j] * (1-p) + dp[i-1][j-1] * p
刷表法:
dp[i+1][j] += dp[i][j] * (1-p)
dp[i+1][j+1] += dp[i][j] * p
jindianti.cppview raw1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <cstdio> using namespace std;
const int N = 2010; double dp[N][N]; int n, t; double p;
int main(){
scanf("%d%d%lf", &n, &t, &p);
for(int i=1;i<=n;i++) dp[0][i] = 0; dp[0][0] = 1; for(int i=1;i<=t;i++){ dp[i][0] = dp[i-1][0] * (1-p); for(int j=1;j<=(i,n-1);j++) { dp[i][j] = dp[i-1][j] * (1-p) + dp[i-1][j-1] * p; } if(i>=n) dp[i][n] = dp[i-1][n] + dp[i-1][n-1] * p; }
double ans = 0; for(int i=1;i<=n;i++) ans += dp[t][i] * i; printf("%.6lf\n", ans); return 0; }
|