题意:给定 n 个人,在每一时刻一个人进入地铁的概率是 p,站着不动的概率是 1-p,然后问你 t 时间地铁里有多少人。
析:很明显这是一个期望DP,用d[i][j]表示 i 时刻 j 个人进入地铁的概率,有两种情况,要么第 i-1 时刻已经有 j 个人了,那么就不进,要么第 i-1 时刻只有 j-1个人,就得进入,
也就是d[i][j] = d[i-1][j] * (1-P) + d[i-1][j-1] * p;这就是状态转移方程,最重要的是有一种情况一定要注意。。。那就是当第 i-1 时刻已经进入 n 个人了,也就是说全部的人都已经进入了,
那么第 i 时刻就不用考虑了,也就是说 d[i][n] = d[i-1][n] + d[i][n-1] * p;这个要特别注意。
代码如下:
#include <iostream> #include <cstdio> using namespace std; const int maxn = 2e3 + 5; double d[maxn][maxn]; int main(){ int n, t; double p; while(scanf("%d %lf %d", &n, &p, &t) == 3){ d[0][0] = 1.0; for(int i = 1; i <= t; ++i){ for(int j = 0; j <= i; ++j) d[i][j] = d[i-1][j] * (1.0-p) + d[i-1][j-1] * p; d[i][n] = d[i-1][n] + d[i-1][n-1] * p;//特判第 i-1 时刻已经进入 n 个人了 } double ans = 0.0; for(int i = 0; i <= n; ++i) ans += d[t][i] * i; printf("%.6lf ", ans); } return 0; }