CoderForces 518D Ilya and Escalator (期望DP)

题意:给定 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;
}
原文地址:https://www.cnblogs.com/dwtfukgv/p/5649854.html