DP[i][j]表示前i时间内进入j个人的概率,那么期望就是 DP[t][i]*i 的和;
DP[i][j] = DP[i-1][j]*(1.0-p) + DP[i-1][j-1]*p;
特例:当 j == n时,已经没有人在等待了,说以DP[i][j] = DP[i-1][j] + DP[i-1][j-1]*p;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 2000 + 7;
double dp[maxn][maxn], p;
int n, t;
int main() {
scanf("%d%lf%d", &n, &p, &t);
memset(dp, 0, sizeof(dp));
double ans = 0.0;
dp[0][0] = 1.0;
for(int i = 1; i <= t; ++i) {
for(int j = 0; j < n; ++j)
dp[i][j] = dp[i-1][j]*(1.0-p) + dp[i-1][j-1]*p;
dp[i][n] = dp[i-1][n] + dp[i-1][n-1]*p;
}
for(int i = 1; i <= n; ++i) ans += dp[t][i]*i;
printf("%.6lf\n", ans);
}
概率DP求期望
本文介绍了一个使用动态规划解决概率问题的方法,通过构建DP数组来计算特定时间内进入人数的期望值。详细展示了状态转移方程及边界条件,并给出了完整的C++实现代码。
212

被折叠的 条评论
为什么被折叠?



